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