Welcome

首页 / 软件开发 / .NET编程技术 / WCF中的同步环境

WCF中的同步环境2010-12-21 MSDN Juval Lowy目录

什么是 .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 帮助器控件背后的基础技术。