2012-12-12 43 views
1

我正試圖找到處理CCR調度程序,DispatcherQueue和Interleave彼此相互關聯的最佳方法。我有一個叫「MyClass」的類,它有一個調度程序和一個調度程序隊列。該類公開了客戶端可以發佈消息的單個PortSet。在「MyClass」中,我爲這些消息創建了持久接收者並連接到調度程序隊列。我還添加了所有接收器作爲單個交錯的一部分。現在,當客戶端認爲使用「MyClass」類完成時,我希望客戶端安全地銷燬該類。有三件事需要在這裏銷燬,即調度器,調度器隊列和交錯器。什麼是最好的方式來做到這一點?我碰巧在鏈接http://channel9.msdn.com/shows/Going+Deep/CCR-Programming-Jeffrey-Richter-and-George-Chrysanthakopoulos/上閱讀討論。雖然沒有明確提到,但我推斷出Dispose的正確方法是我需要首先將拆卸消息發佈到交織器,等待交織器拆卸然後處置調度器隊列。現在,我的類的配置代碼如下所示。如何安全地處理CCR調度程序,調度程序隊列和交錯

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>(); 
    } 
} 

請澄清,如果這是正確的做法還是我失去了一些東西。

感謝,

Venkat

回答

0

小注:在InternalMessagesPort你不應該需要使用PostUnknownType,你就應該能夠使用後()

唯一令你應該需要處理的是Dispatcher,其他的一切都應該通過垃圾收集來保護自己。

一般來說,CCR對象(端口,任務,接收器,因果關係等)與GC很好地協同工作。簡而言之,只要沒有引用端口,那麼與其相關的所有其他內容也將被收集(當然,假設沒有其他引用)。

DispatcherQueues在處理擁有的Dispatcher時被清除。