相互にリンクしている CCR Dispatcher、DispatcherQueue、および Interleave を処分する最善の方法を見つけようとしています。単一のディスパッチャと単一のディスパッチャ キューを持つ「MyClass」というクラスがあります。このクラスは、クライアントがメッセージを投稿できる単一の PortSet を公開します。「MyClass」では、これらのメッセージの永続的なレシーバーを作成し、ディスパッチャー キューにアタッチしました。また、単一のインターリーブの一部としてすべてのレシーバーを追加しました。クライアントが「MyClass」クラスを使用して完了したと判断した場合、クライアントにクラスを安全に破棄してもらいたいと考えています。ここで破棄する必要があるのは、ディスパッチャ、ディスパッチャ キュー、およびインターリーブの 3 つです。それを行う最善の方法は何ですか?たまたまリンク先の議論を読んだ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>();
}
}
これが正しいアプローチなのか、何か不足しているのかを明確にしてください。
ありがとう、
ベンカット