在前面介绍ACE主动对象中我已经简单的介绍了一下主动对象模式,今天这里我就简单的介绍一下主动对象在C#中的实现。
所谓主动对象是相对于被动对象(passive object)而言的,被动对象的方法的调用和执行都是在同一个线程中的,被动对象方法的调用是同步的、阻塞的,一般的对象都属于被动对象;主动对象的方法的调用和执行是分离的,主动对象有自己独立的执行线程,主动对象的方法的调用是由其他线程发起的,但是方法是在自己的线程中执行的,主动对象方法的调用是异步的,非阻塞的。
本框架有如下几部分构成:
-
一个ActiveObject类,从Thread继承,封装了并发逻辑的活动对象
-
一个ActiveQueue类,主要用来存放调用者请求
-
一个IMethodRequest接口,主要用来封装调用者的请求,Command设计模式的一种实现方式
它们的一个简单的实现如下:
interface IMethodRequest |
在主动对象的三个成员ActiveObject ,IMethodRequest,ActiveQueue中,前两个都比较简单,很容易想到实现的方法。稍微复杂一点的是ActiveQueue对象,它要求提供一个线程安全的操作类,这里我仿照ACE利用Queue简单的封装了一个,为了使用简单,我把它的Enqueue和Dequeue方法简单的修改了一下。
-
当使用Enqueue方法时,如果队列中的元素个数已经达到最大个数限制,将会阻塞至队列中元素被Dequeue取走。
-
当使用Enqueue方法时,如果队列中无可用元素,将会阻塞至其它线程通过Enqueue将元素插入至队列中,然后返回可用元素。
我采用Monitor实现了这种线程同步,有兴趣的朋友可以参看一下。
主动对象是一种常用的异步通信模式,这里我简单的给出了一种C#的实现。当然,我这里的例子还不是很完善,更多知识可以看一下我以前介绍ACE主动对象的相关章节。