1

我正在尝试找到处理相互关联的 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>();
    }
}

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

谢谢,

文卡特

4

1 回答 1

0

次要注意:在 InternalMessagesPort 上,您不需要使用 PostUnknownType,您应该能够使用 Post()

您唯一需要处理的是 Dispatcher,其他一切都应通过垃圾收集自行处理。

一般来说,CCR 对象(端口、任务、接收器、因果关系等)可以很好地与 GC 配合使用。简单来说,只要没有对端口的引用,那么与它关联的所有其他内容也将被收集(当然假设没有其他引用)。

DispatcherQueues 在拥有的 Dispatcher 被释放时被清理。

于 2013-05-04T01:03:00.577 回答