Welcome

首页 / 软件开发 / .NET编程技术 / 线程之间的通讯---SynchronizationContext

线程之间的通讯---SynchronizationContext2011-11-30 博客园 Kevin-moon过年前的这段时间真是舒服,没有了平时项目发版的紧张,剩下的就是只有在网上闲逛了,哈哈!

今天早上闲逛的时候,在CodeProject发现了个不错的文章,英文好的直接去http://www.codeproject.com/KB/threads/SynchronizationContext.aspx看吧,不好,就将就的看下我的吧,呵呵!(没有直接翻译,不过大概的思路相同)

理解SynchronizationContext

SynchronizationContext 类是一个基类,可提供不带同步的自由线程上下文。 此类实现的同步模型的目的是使公共语言运行库内部的异步/同步操作能够针对不同的异步模型采取正确的行为。此模型还简化了托管应用程序为在不同的同步环境下正常工作而必须遵循的一些要求。同步模型的提供程序可以扩展此类并为这些方法提供自己的实现。(来自MSDN)

简而言之就是允许一个线程和另外一个线程进行通讯,SynchronizationContext在通讯中充当传输者的角色。另外这里有个地方需要清楚的,不是每个线程都附加SynchronizationContext这个对象,只有UI线程是一直拥有的。

这里你可能有个问题:对于UI线程来说,是如何将SynchronizationContext这个对象附加到线程上的呢?!OK,我们先从下面的代码开始,

[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);// let"s check the context herevar context = SynchronizationContext.Current;if (context == null)MessageBox.Show("No context for this thread");elseMessageBox.Show("We got a context");// create a formForm1 form = new Form1();// let"s check it again after creating a formcontext = SynchronizationContext.Current;if (context == null)MessageBox.Show("No context for this thread");elseMessageBox.Show("We got a context");if (context == null)MessageBox.Show("No context for this thread");Application.Run(new Form1());}
运行结果:

1、No context for this thread

2、We got a context