簡體   English   中英

如何取消可在多點取消的長時間運行操作?

[英]How to cancel a long-running operation that can be cancelled at many points?

我們有一個長期運行的操作,包括許多可以取消的點。 如果我們要使用任務取消令牌方法,我們需要確保在每個所需位置檢查取消。

這對我們來說似乎不是最理想的。 我們在這里看到兩個問題:

  1. 我們需要在每個有取消機會的地方進行取消令牌檢查,我們覺得這些地方會使代碼混亂,並且有可能錯過代碼中有其他取消機會的點數。
  2. 如果我們遵循指南以避免全局變量,我們需要將取消令牌作為參數傳遞給許多方法,我們認為這些方法是重復的並且使代碼混亂。

我們應該使用全局取消令牌來處理2.? 我們應該使用AppDomain來處理1.和2.?

我們需要確保在每個要求的地方檢查取消。

這是處理這個問題的正確方法。

全局令牌不能解決每個所需位置的檢查問題,並且只能幫助不將令牌作為參數傳遞給方法。 它確實限制了您 - 如果您使用全局令牌,則會剝奪現在或將來修改您的例程以在單獨取消時進行多個操作的能力。

但是,我認為傳遞令牌實際上是一件好事。 這使得您的API自我記錄 - 每個接受令牌的方法都可能引發OperationCanceledException並支持取消。

避免這些問題的任何其他方法都需要一個不合作的取消模型。 這有不利的副作用,因為強行“殺死”運行操作很少是好事(例如,有很多理由可以避免易於查找的Thread.Abort)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM