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     }
原文地址:https://www.cnblogs.com/lovey/p/3011016.html