서로 연결되어있는 CCR Dispatcher, DispatcherQueue 및 Interleave를 처리하는 가장 좋은 방법을 찾으려고합니다. 단일 디스패처와 단일 디스패처 큐가있는 클래스 "MyClass"가 있습니다. 이 클래스는 클라이언트가 메시지를 게시 할 수있는 단일 PortSet을 노출합니다. "MyClass"에서는 이러한 메시지에 대한 영구 수신기를 만들고 디스패처 큐에 연결했습니다. 또한 모든 수신자를 하나의 Interleave의 일부로 추가했습니다. 이제 클라이언트가 "MyClass"클래스를 사용하여 완료되었다고 생각할 때 클라이언트가 클래스를 안전하게 파괴하기를 원합니다. Dispatcher, Dispatcher Queue 및 Interleave 중 하나 인 여기에서 파기해야하는 세 가지가 있습니다. 그렇게하는 가장 좋은 방법은 무엇입니까? 나는 http://channel9.msdn.com/shows/Going+Deep/CCR-Programming-Jeffrey-Richter-and-George-Chrysanthakopoulos/ 링크에서 토론을 읽었습니다. 명시 적으로 언급하지는 않았지만, Dispose의 올바른 방법은 먼저 인터리브에 메시지 분리를 게시하고 인터리브가 티 아웃되도록 기다린 다음 디스패처 큐를 처리해야한다는 것입니다. 자, 내 수업의 처분 코드는 다음과 같이 보일 것입니다.안전하게 CCR Dispatcher, DispatcherQueue 및 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>();
}
}
이 방법이 올바른지 또는 내가 누락 된 것인지 명확히하십시오.
감사합니다,
벤 카트