2011-09-05 51 views
2

我傾向於使用下面的模式有很多不同的地方用倒計時通知事件發生時間延遲,並有能力取消:最佳實踐與倒計時通知線程延遲

CancellationToken ctoken = new CancellationToken(); 
for (int i = 0; i < 10; i++) 
{ 
    if (ctoken.IsCancellationRequested) break; 
    Thread.Sleep(1000); 
    if (ctoken.IsCancellationRequested) break; 
    if (Status != null) Status(this, new StatusEventArgs(i)); 
} 

我想do是將這個模式抽象到它自己的系統中,我可以使用它來阻止任何特定的線程,直到達到倒計時。有這種最佳做法嗎?它必須提供詳細的狀態反饋(最好我可以告訴它每秒鐘通知我,十分之一秒等),並且它必須支持取消(最好有比每秒更好的響應)。我覺得我應該在.NET 4.0中使用新的CountdownEvent功能,或者使用Monitor而不是隻是睡覺,但我希望在這裏有更好的見解。

回答

2

你應該做的第一件事是分開反饋和取消的想法。也就是說,你有一個反饋機制和一個取消機制,但它們根本沒有關係。如果你能分開這兩個概念,那麼事情就會變得更容易處理,並且性能也會更好。

您想以某個間隔提供反饋,這意味着一個計時器。而不是輪詢查看是否要求取消,您可以等待等待處理。

喜歡的東西:

int i = 0; 
using (System.Threading.Timer tmr = new System.Threading.Timer((s) => 
    { 
     if (Status != null) Status(this, new StatusEventArgs(i)); 
     ++i; 
    }, null, 1000, 1000)) 
{ 
    token.WaitHandle.WaitOne(TimeSpan.FromSeconds(10))); 
} 

我認爲你從別的地方得到CancellationToken(即它的傳入,或者將其定義及其他可能影響其狀態)。

+0

這看起來非常接近我的設想。但是,我沒有看到WaitOne和TimeSpan需要重載的'WaitOne'。這應該是'token.WaitHandle.WaitOne(TimeSpan.FromSeconds(10));'? – drharris

+0

'token.WaitHandle.WaitOne()'是正確的路要走。感謝這個建議;它確實有助於清理事情,而且它的性能似乎更好! – drharris

+0

@drharris:感謝您指出錯誤。我已更正了代碼。 –