2012-12-12 2 views
1

서로 연결되어있는 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>(); 
    } 
} 

이 방법이 올바른지 또는 내가 누락 된 것인지 명확히하십시오.

감사합니다,

벤 카트

답변

0

마이너 참고 : InternalMessagesPort에 당신은 당신은 포스트()

있는 유일한 방법을 사용할 수 있어야합니다, PostUnknownType를 사용할 필요가 없습니다 당신을 Dispatcher를 처분해야하는데 나머지는 가비지 수집을 통해 자체 처리해야합니다.

일반적으로 CCR 개체 (포트, 작업, 수신기, 인과 관계 등)는 GC에서 잘 작동합니다. 간단히 말하면, 포트에 대한 언급이 없 자마자 포트와 관련된 모든 것이 수집 될 것입니다 (물론 다른 참조 사항은 없다고 가정).

소유 Dispatcher가 처리 될 때 DispatcherQueues가 정리됩니다.

관련 문제