[C#]C#学习笔记-多线程

C#学习笔记-多线程

罗朝辉(http://www.cnblogs.com/kesalin/

《C#与.NET高级程序设计》读书笔记

 

1,在.NET平台下,应用程序域和线程之间不是一一对应的,一个应用程序域可以有多个线程,而一个特定的线程在它的生命周期内不一定被限定在一个应用程序域中。Win32线程调度程序和CLR会根据需要让线程能够自由地跨越应用程序域的边界,但任何特定时刻,一个线程只能运行在一个应用程序域中。System.Threading命名空间定义了与线程相关的类型。当希望访问(正在承载当前线程的)应用程序域时,请使用Thread.GetDomain()。在任何特定时刻,一个线程也可以移动到一个特定的上下文,并有CLR重新部署在一个新的上下文中。使用Thread.CurrentContext属性可以获得正在执行中的线程的当前上下文。CLR控制线程移入/移出应用程序域或上下文。

2,可以使用异步委托来自动创建次线程以外处理异步方法调用。System.Threading命名空间也定义了很多用来同步访问共享资源的类型。

3,前台线程能阻止应用程序的终结。一直到所有的前台线程终止后,CLR才能关闭应用程序(即卸载承载的应用程序域)。后台线程(有时也叫守护线程)被CLR认为是程序执行中可做出牺牲的途径,即在任何时候(即使这个线程此时正在执行某项工作)都可能被忽略。因此,如果所有的前台线程终止,当应用程序域卸载时,所以的后台线程也会被自动终止。

4,同步访问共享资源的首选技术是C#的 lock 关键字,lock 允许定义一段线程同步的代码语句,它需要定义一个标记(即一个对象引用),线程在进入锁定范围的时候必须获得这个标记,在退出锁定范围时需要释放锁。当试图锁定的是一个实例级的私有方法时,使用方法本身所在对象的引用就可以了。然而,如需锁定公共成员中的一段代码,比较安全的做法是声明私有的object成员作为锁标识。如:

public class Printer
{
// 锁标识
private object threadLock = new object();
public void PrintNumbers()
{
// 使用锁标识
lock (threadLock)
{
...
}
}

若试图锁定静态方法中的代码,只需要声明一个私有静态对象成员作为锁定标记就可以了。

5,C# lock 声明实际上是和 System.Threading.Moniter类一同使用时的速记符号。经过编译器的处理,锁定区域实际上被转化成了如下内容(可使用 ildasm.exe查看):

public void PrintNumbers()
{
Monitor.Enter(threadLock);
try
{
...
}
finally
{
Monitor.Exit(threadLock);
}
}

6,System.Threading.Interlocked 允许我们对数据进行一些原子操作:CompareExchange(), Decrement(), Exchange(), Increment()。这些静态方法需要以引用方式传入变量。如:注意newVal 和 intVal 的值都是递增之后的值。

public void AddOne()
{
int newVal = Interlocked.Increment(ref intVal);
}

7,[Synchronization]特性可以有效地使对象的所以实例的成员都保持线程安全。当CLR分配带[Synchronization]特性的对象时,它会把这个对象放在同步上下文中。这是编写线程安全代码的一种“偷懒”方式,因为它不需要我们实际深入线程控制敏感数据的细节,但这种方式对性能有影像,因为即使一个方法没有使用共享资源,CLR仍然会锁定对该方法的调用。

8,System.Threading命名空间中定义了 ThreadPool,线程池是由CLR维护的。System.Threading命名空间中还有 Timer 类型和与其相关的 TimerCallback 委托。

9,BackgroundWorker 组件:当构建一个图形化的Windows Form桌面应用程序并且需要执行在应用程序UI线程之外的线程中长时间的任务(如调用远程Web服务,进行数据库事务等)时,BackgroundWorker类就很有用。该类的编程模型利用了很多结合异步委托的相同线程语法。我们只需要告诉BackgroundWorker我们希望在后台执行哪个方法并调用RunWorkerAsync()即可。调用线程继续运行,而工作方法会被异步执行,当工作方法执行完毕,BackgroundWorker就会通过触发 RunWorkerCompleted 事件来通知调用线程。

 

posted @ 2012-02-20 10:42  飘飘白云  阅读(1274)  评论(0编辑  收藏  举报
本博客遵循 Creative Commons License “署名-非商业用途-保持一致”创作共用协议。 与我联系