C#中实现主动对象模式

在前面介绍ACE主动对象中我已经简单的介绍了一下主动对象模式,今天这里我就简单的介绍一下主动对象在C#中的实现。

所谓主动对象是相对于被动对象(passive object)而言的,被动对象的方法的调用和执行都是在同一个线程中的,被动对象方法的调用是同步的、阻塞的,一般的对象都属于被动对象;主动对象的方法的调用和执行是分离的,主动对象有自己独立的执行线程,主动对象的方法的调用是由其他线程发起的,但是方法是在自己的线程中执行的,主动对象方法的调用是异步的,非阻塞的。

本框架有如下几部分构成:

  1. 一个ActiveObject类,从Thread继承,封装了并发逻辑的活动对象 
  2. 一个ActiveQueue类,主要用来存放调用者请求 
  3. 一个IMethodRequest接口,主要用来封装调用者的请求,Command设计模式的一种实现方式

它们的一个简单的实现如下:

interface IMethodRequest
{
    void Call();
}

class ActiveQueue<T>
{
    const int maxCount = 10; //
最大个

    Queue<T> queue = new Queue<T>();
    public void Enqueue(T item)
    {
        lock (this)
        {
            if (queue.Count >= maxCount)
            {
                Monitor.Wait(this);
            }
            queue.Enqueue(item);
            Monitor.PulseAll(this);
        }
    }

    public T Dequeue()
    {
        lock (this)
        {
            if (queue.Count == 0)
            {
                Monitor.Wait(this);
            }
            T item = queue.Dequeue();
            Monitor.PulseAll(this);
            return item;
        }
    }
}

class ActiveObject
{
    ActiveQueue<IMethodRequest> cmdQueue = new ActiveQueue<IMethodRequest>();

    public ActiveObject()
    {
        ThreadPool.QueueUserWorkItem(ExcuteCommand);
    }

    public void AddCommand(IMethodRequest cmd)
    {
        cmdQueue.Enqueue(cmd);
    }

    private void ExcuteCommand(object obj)
    {
        while (true)
        {
            IMethodRequest cmd = cmdQueue.Dequeue();
            cmd.Call();
        }
    }
}

在主动对象的三个成员ActiveObject ,IMethodRequest,ActiveQueue中,前两个都比较简单,很容易想到实现的方法。稍微复杂一点的是ActiveQueue对象,它要求提供一个线程安全的操作类,这里我仿照ACE利用Queue简单的封装了一个,为了使用简单,我把它的Enqueue和Dequeue方法简单的修改了一下。

  1. 当使用Enqueue方法时,如果队列中的元素个数已经达到最大个数限制,将会阻塞至队列中元素被Dequeue取走。
  2. 当使用Enqueue方法时,如果队列中无可用元素,将会阻塞至其它线程通过Enqueue将元素插入至队列中,然后返回可用元素。

我采用Monitor实现了这种线程同步,有兴趣的朋友可以参看一下。

主动对象是一种常用的异步通信模式,这里我简单的给出了一种C#的实现。当然,我这里的例子还不是很完善,更多知识可以看一下我以前介绍ACE主动对象的相关章节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值