我正在尝试找到处理相互关联的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
答案 0 :(得分:0)
次要注意:在InternalMessagesPort上你不应该使用PostUnknownType,你应该只能使用Post()
你唯一需要处理的是Dispatcher,其他一切都应该通过垃圾收集来处理。
一般来说,CCR对象(端口,任务,接收器,因果关系等)与GC配合良好。简单来说,一旦没有对端口的引用,那么与其相关的所有其他内容也将被收集(当然,假设没有其他引用)。
在处置拥有的Dispatcher时,将清除DispatcherQueues。