目录
什么是 .NET 同步环境?
WCF 和同步环境
服务自定义 同步环境
线程关联同步环境
优先级处理
回调和同步环境
为什么要使用同步环境?
Windows Communication Foundation (WCF) 的一个比较有用的功能是它依赖 Microsoft .NET Framework 同步环境来封送对服务实例(或回调对象)的调用。此机制同时为面 向生产力的开发和强大的可扩展性提供支持。在本专栏中,我将简要说明什么是 同步环境,以及 WCF 如何使用它们,然后会演示可用于扩展 WCF 的各个选项, 从而以编程的方式或声明的方式使用自定义的同步环境。除了解自定义同步环境 的优点之外,您还将看到一些高级的 .NET 编程,以及 WCF 可扩展性技术。
什么是 .NET 同步环境?
.NET Framework 2.0 引入了一个鲜为 人知的功能,称为同步环境,它由 System.Threading 命名空间中的 SynchronizationContext 类定义:
public delegate void SendOrPostCallback(object state);
public class SynchronizationContext
{
public virtual void Post (SendOrPostCallback callback,object state);
public virtual void Send(SendOrPostCallback callback,object state);
public static void SetSynchronizationContext
(SynchronizationContext context);
public static SynchronizationContext Current
{get;}
//More members
}
同步环境存储在线程本 地存储 (TLS) 中。使用 .NET Framework 2.0 创建的每个线程都可以有一个可 通过 SynchronizationContext 的静态 Current 属性获得的同步环境(与环境 事务类似)。如果当前的线程没有同步环境,则 Current 可能会返回空值。同 步环境可用来在调用线程和目标线程之间传递方法调用(万一该方法无法在原来 的调用线程上执行)。调用线程会封装其准备封送到另一个(些)线程的方法( 通过 SendOrPostCallback 类型的委托),然后分别针对同步或异步执行,将其 提供给 Send 或 Post 方法。通过调用静态方法 SetSynchronizationContext 可将同步环境与当前的线程关联起来。
迄今为止,最常见的同步环境用 法与 UI 更新有关。在所有的多线程 Windows 技术中(从 MFC 到 Windows Forms,再到 WPF),只有创建了窗口的线程才可以通过处理其消息来更新它。 这个限制与 Windows 消息循环和线程消息传递体系结构的基础用法有关。在开 发多线程 UI 应用程序时,消息传递体系结构会产生一个问题 — 您会希 望在执行耗时较长的操作或接收回调时避免阻止 UI。当然,这样就必须使用工 作线程,然而那些线程却无法直接更新 UI,因为它们不是 UI 线程。
在 .NET Framework 2.0 中,为了解决这个问题,任何基于 Windows Forms 的控件 或窗体的构造函数都会查看它正在其上运行的线程是否有同步环境,如果没有, 该构造函数就会附加一个新同步环境(称为 WindowsFormsSynchronizationContext)。这个专用的同步环境可以将所有对其 Post 或 Send 方法的调用转换成 Windows 消息,并将它们发布给要在正确的线 程上处理的 UI 线程消息队列。Windows Forms 同步环境是常用的 BackgroundWorker 帮助器控件背后的基础技术。