如何安全地处理CCR Dispatcher,DispatcherQueue和Interleave

时间:2012-12-12 20:15:48

标签: ccr robotics-studio

我正在尝试找到处理相互关联的CCR Dispatcher,DispatcherQueue和Interleave的最佳方法。我有一个类说“MyClass”,它有一个调度程序和一个调度程序队列。该类公开了客户端可以向其发布消息的单个PortSet。在“MyClass”中,我为这些消息创建了持久接收器并附加到调度程序队列。我还将所有接收器添加为单个Interleave的一部分。现在,当客户端认为使用“MyClass”类完成时,我希望客户端安全地销毁该类。这里需要销毁的东西有三个,即调度程序,调度程序队列和交错。最好的方法是什么?我碰巧阅读了链接http://channel9.msdn.com/shows/Going+Deep/CCR-Programming-Jeffrey-Richter-and-George-Chrysanthakopoulos/中的讨论。虽然没有明确提及,但我推断Dispose的正确方法是我需要首先向交错发送拆除消息,等待交错拆除然后处理调度程序队列。现在,我班级的处理代码如下所示。

var teardownInterleave = new TeardownInterleave();
InternalMessagesPort.PostUnknownType(teardownInterleave);
var done = new ManualResetEvent(false);
Activate(Arbiter.Receive(false, teardownInterleave.CompletionPort,
    emptyValue => done.Set()));
done.WaitOne();
Thread.Sleep(100);

// Dispose the TaskQ
TaskQueue.Dispose();

/// <summary>
/// Message posted to any interleave asking it to teardown.
/// </summary>
public sealed class TeardownInterleave
{
    /// <summary>
    /// Gets the completion port.
    /// </summary>
    /// <value>
    /// The completion port.
    /// </value>
    public Port<EmptyValue> CompletionPort { get; private set; }

    /// <summary>
    /// Initializes a new instance of the <see cref="TeardownInterleave" /> class.
    /// </summary>
    public TeardownInterleave()
    {
        CompletionPort = new Port<EmptyValue>();
    }
}

请澄清这是正确的做法还是我遗漏了什么。

谢谢,

Venkat

1 个答案:

答案 0 :(得分:0)

次要注意:在InternalMessagesPort上你不应该使用PostUnknownType,你应该只能使用Post()

你唯一需要处理的是Dispatcher,其他一切都应该通过垃圾收集来处理。

一般来说,CCR对象(端口,任务,接收器,因果关系等)与GC配合良好。简单来说,一旦没有对端口的引用,那么与其相关的所有其他内容也将被收集(当然,假设没有其他引用)。

在处置拥有的Dispatcher时,将清除DispatcherQueues。