原文链接
线程套间约束
当与某些遗留的Windows组件,特别是COM对象交互时需要特定的线程套件策略。甚至最近的框架,例如.net WinForms,也需要在运行WinForm的线程上应用单线程套间(SingleThreadedApartment)策略。
CCR可以轻松的承载STA组件或者与它互操作:组件应该创建一个只有一个线程的CCR Dispatcher实例,并且在Dispatcher的构造函数中指定线程套间策略。DispatcherQueue实例就可以在与需要和遗留代码交互的地方使用这个dispatcher来激活处理函数(activating handlers)。这些处理函数就可以安全的访问COM或者WinForm对象,同时对其他的CCR组件隐藏它们的STA关系,以便其他CCR组件可以简单的投递元素到常规的CCR ports而不需要关心port上的处理函数使用的是什么dispatcher。
CCR WinFrom适配库(Ccr.Adapters.Winforms.dll)是一个在CCR中运行.net WinForm的便利方法。
与应用的主线程协调
CCR软件组件经常在一个CLR应用的上下文中中执行,例如一个独立执行程序。.net运行时使用一个操作系统线程启动一个程序,当线程退出时终止程序。由于CCR应用是异步、并发的,所以它们在没有消息被发送时处于非激活状态,并且几乎不会阻塞任何线程。CCR Dispatcher将保持线程在一种高效的休眠状态,但是如果其它的线程被作为后台线程创建,应用程序将会退出,那么CCR还在执行。
一个与CLR启动的同步世界接口的常见模式是使用System.Threading.AutoResetEvent来阻塞应用的主线程,直到CCR应用完成。AutoResetEvent事件可以被任何CCR处理函数触发。
例25.
void InteropBlockingExample()
{
// create OS event used for signalling
AutoResetEvent signal = new AutoResetEvent(false);
// schedule a CCR task that will execute in parallel with the rest of
// this method
Arbiter.Activate(
_taskQueue,
new Task<AutoResetEvent>(signal,SomeTask)
);
// block main application thread form exiting
signal.WaitOne();
}
/// <summary>
/// Handler that executes in parallel with main application thread
/// </summary>
/// <param name="signal"></param>
void SomeTask(AutoResetEvent signal)
{
try
{
for (int i = 0; i < 1000000; i++)
{
int k = i * i / 10;
}
}
finally
{
// done, signal main application thread
signal.Set();
}
}
在上面的例子中,我们演示了一个使用操作系统事件来阻塞应用程序主线程的小例子。
.NET异步编程模型适配器
CCR可以包装实现了APM Begin/End异步模式的类。一个CCR类可以返回一个抽象了APM模式细节和复杂性的port(或者PortSet)。MSDN杂志的Concurrent Affairs文章非常详细的展示了这种互操作模式。
参考
MSDN Magazine: Concurrent Affairs -- Concurrency and Coordination Runtime