你如何設計一個支持取消操作的方法/類?提供支持取消的方法/類/組件的最佳做法是什麼?
我意識到我從來沒有以一致的方式做到這一點,我想改變這一點。
一些我所使用過的東西:
- 在類的布爾屬性IsCancelled,我在內部同步。有時我有一個CanCancel屬性,如果操作無法在任何給定時間取消
- 傳遞一個Func < bool>委託,我反覆調用以查看操作是否已被取消。
- 手動終止線程 - 雖然這肯定是不好的做法
通常你如何做到這一點?
你如何設計一個支持取消操作的方法/類?提供支持取消的方法/類/組件的最佳做法是什麼?
我意識到我從來沒有以一致的方式做到這一點,我想改變這一點。
一些我所使用過的東西:
通常你如何做到這一點?
我寧願使用IsCancelled
財產的想法。你的後臺線程方法可以在適當的時候檢查它,根據需要進行任何清理,並終止操作。如果在線程完成時使用回調方法,則很容易檢查屬性並查看它是否有效。我曾經使用過使用這個策略的框架工作線程類,它運行良好。
回到用例:你試圖提供什麼樣的行爲?如果你有一個你想取消的異步操作,那麼你可能最好的實現一個方法,讓你通過一個標誌或一個信號通知另一個線程。發送信號是引起注意的一個好方法,但我沒有看過C#處理信號的方法。如果您需要能夠取消和撤消,Command模式派上用場。
我會去CancellationTokenSource
並使用其相關的CancellationToken
作爲信號消除的手段。這是.Net Framework v4中的新功能。
概念是,CancellationTokenSource
只需調用取消,您的代碼就可以共享CancellationToken
,您可以在其上定期檢查其中的IsCancellationRequested
屬性。在緊密循環或更長時間運行的操作中尤其如此,以便讓代碼及時停止。
的額外的好處是,即使阻塞阻止由於等待線程上的SemaphoreSlim
,ManualResetEventSlim
可以用信號正常退出,因爲這些類接受CancellationToken
在其Wait
方法在.Net框架V4
例如看看:ManualResetEventSlim.Wait有過載接受CancellationToken
。
你曾經爲單一方法而不是類實現這個嗎? 與IsCancelled的事情是,我不斷重新實現,我需要它的每一個類。對於這種事情有一個單獨的實現是很好的。 – 2009-01-16 02:30:39