NCindy

.net 2.0平台上的高性能网络程序开发框架
随笔 - 46, 文章 - 0, 评论 - 131, 引用 - 4
数据加载中……

与非CCR代码互操作

原文链接

线程套间约束

当与某些遗留的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

posted on 2007-12-17 22:39 iceboundrock 阅读(132) 评论(0)  编辑 收藏 所属分类: Parallel & Concurrency


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-12-18 14:43 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: