Professional c# 2008.Ch19线程和同步
概述
一个进程的多个线程可以运行在不同的cpu上,或者多个核心的cpu的不同核心上。
windows 资源管理其thread列可以查看进程和每个进程的线程号。
进程包含资源,例如window句柄、文件系统句柄和其他核心对象。每个进程都分配了虚拟内存。一个进程至少包含一个线程。操作系统会调度线程。线程有一个优先级、正在处理的程序的位置的计算器、一个存储器本地变量的堆栈。每个线程都有自己的堆栈,但程序代码的内存和对有进程内所有线程共享。这使一个进程中的所有线程通讯非常快--该进程的所有线程都寻址相同的虚拟内存。但是,这也是处理比较苦难,因为多个线程可以修改同一个位置的内存。
进程管理的资源包括虚拟内存和windows 句柄,其中至少包含一个线程,线程是运行程序所必须的。
.Net 托管线程有Thread类定义,托管线程不一定映射到操作系统线程。尽管这样的情况可能出现,但应由.Net运行库将托管线程映射到操作系统的物理线程上。这方面sql server 2005 的运行主机与windws的运行主机完全不同。使用ProcessThread可以获得内部现成的信息,但在托管的应用程序中,通常最好使用托管线程。
异步委托
创建线程的简单方法是定义一个委托,异步调用它,委托是方法类型安全的引用。Delegete类还支持异步调用方法。在后天Delegete类类会创建一个执行任务的线程。
Delegate。Demo
1 public delegate int TakesAWhileDelegate(int data, int ms); 2 class Program 3 { 4 static void Main(string[] args) 5 { 6 TakesAWhileDelegate take = TakesWhile; 7 IAsyncResult ir = take.BeginInvoke(1, 3000, null, null); 8 while (!ir.IsCompleted) 9 { 10 Console.Write("."); 11 Thread.Sleep(50); 12 } 13 int result = take.EndInvoke(ir); 14 Console.WriteLine(result); 15 Console.ReadKey(); 16 } 17 static int TakesWhile(int data, int ms) 18 { 19 Console.WriteLine("TasksAWhile is started."); 20 Thread.Sleep(ms); 21 Console.WriteLine("TakesAWHile is end."); 22 return ++data; 23 } 24 }