2013-10-18 46 views
4

我們有一個長時間運行的操作,可以取消很多點。如果我們要使用任務取消標記方法,我們需要確保我們在每個需要的地方檢查取消。如何取消可以在多個點取消的長時間運行?

這對我們來說似乎並不理想。我們看到了兩個問題在這裏:

  1. 我們需要一個取消標記檢查,在每一個地方有註銷,我們感到雜波的代碼,並沒有錯過在代碼點的潛在機會的地方在哪 有還有其他的取消機會。
  2. 如果我們遵循指導來避免全局變量,我們需要將取消標記作爲參數傳遞給許多方法,我們認爲這些方法是重複性的並且混亂了代碼。

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

回答

5

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

這真的是正確的處理方法。

全局令牌不能解決在每個需要的地方進行檢查,並且只會潛在地幫助不將令牌作爲參數傳遞給方法。它確實限制了你 - 如果你使用全局令牌,那麼現在或將來會修改你的例程以使多個操作在單獨取消的情況下進行。

但是,我會爭辯說,傳遞令牌實際上是一件好事。這使得您的API自動記錄 - 接受令牌的每種方法都可能會引起OperationCanceledException並支持取消。

任何其他避免這些問題的方法都需要一個不合作的取消模型。這具有不利的副作用,因爲強行「殺死」運行操作很少是一件好事(例如,避免容易找到Thread.Abort的原因很多)。

+0

有關使用'AppDomain'的說法? – beluchin

+1

@beluchin這取決於你的意思是什麼「使用AppDomain」 - 但我在我的最後一段中解決了這個問題...... –

+1

完全同意答案。這是遵循的正確模式。我不認爲這種方法會「混亂」代碼,將令牌作爲參數傳遞給每個參與方法實際上使合同清晰明確,表明該方法支持取消。 –

相關問題