2009-01-16 45 views
1

你如何設計一個支持取消操作的方法/類?提供支持取消的方法/類/組件的最佳做法是什麼?

我意識到我從來沒有以一致的方式做到這一點,我想改變這一點。

一些我所使用過的東西:

  • 在類的布爾屬性IsCancelled,我在內部同步。有時我有一個CanCancel屬性,如果操作無法在任何給定時間取消
  • 傳遞一個Func < bool>委託,我反覆調用以查看操作是否已被取消。
  • 手動終止線程 - 雖然這肯定是不好的做法

通常你如何做到這一點?

回答

1

我寧願使用IsCancelled財產的想法。你的後臺線程方法可以在適當的時候檢查它,根據需要進行任何清理,並終止操作。如果在線程完成時使用回調方法,則很容易檢查屬性並查看它是否有效。我曾經使用過使用這個策略的框架工作線程類,它運行良好。

+0

你曾經爲單一方法而不是類實現這個嗎? 與IsCancelled的事情是,我不斷重新實現,我需要它的每一個類。對於這種事情有一個單獨的實現是很好的。 – 2009-01-16 02:30:39

1

回到用例:你試圖提供什麼樣的行爲?如果你有一個你想取消的異步操作,那麼你可能最好的實現一個方法,讓你通過一個標誌或一個信號通知另一個線程。發送信號是引起注意的一個好方法,但我沒有看過C#處理信號的方法。如果您需要能夠取消和撤消,Command模式派上用場。

1

我會去CancellationTokenSource並使用其相關的CancellationToken 作爲信號消除的手段。這是.Net Framework v4中的新功能。

概念是,CancellationTokenSource只需調用取消,您的代碼就可以共享CancellationToken,您可以在其上定期檢查其中的IsCancellationRequested屬性。在緊密循環或更長時間運行的操作中尤其如此,以便讓代碼及時停止。

的額外的好處是,即使阻塞阻止由於等待線程上的SemaphoreSlimManualResetEventSlim可以用信號正常退出,因爲這些類接受CancellationToken在其Wait方法在.Net框架V4

例如看看:ManualResetEventSlim.Wait有過載接受CancellationToken

相關問題