2015-02-11 44 views
5

我正在做一些異步操作,我想使用CancellationToken停止運行異步任務,例如用戶請求此示例。爲了做到這一點,是否有一個良好的做法,有一個字典,我可以找到正確的線程,以停止正確的操作?目前有什麼我看是這樣的:取消令牌源示例

public Dictionary<Thread, CancellationToken> CancellationTokenData; 

因此,如果用戶上也應做正確,如果我沒看錯的操作請求取消?

這樣做的最佳做法是什麼?

例如,假設用戶使用線程{B}在數據庫內的集合{A}上執行一些非常長的操作。然後他取消該操作並對另一個線程的集合{A}使用另一個冗長的操作。我應該爲當前的CancellationToken使用全局變量嗎?

+0

我不能說我明白你在問什麼,但取消很簡單,絕對沒有理由跟蹤線程。您創建CancellationTokenSource並將其令牌傳遞給任何冗長的操作,即接受取消令牌的任何方法。客戶端調用'source'來中止,源代表令牌,監視它的任何*操作*優雅地終止。這是終止的操作/方法,而不是線程。沒有「當前」令牌,你可以將相同的令牌傳遞給多個操作 – 2015-02-11 16:04:39

+0

@PanagiotisKanavos好吧,但是你使用局部變量來做到這一點嗎?如果我使用本地變量,我會受到太大限制,我只能稱它爲在當前方法裏面,如果我用它作爲全局變量,事情會變得凌亂嗎?我應該每個人都有一個全球?我希望我們在同一條軌道上。 – Hristo 2015-02-11 16:07:13

+0

我是否理解你的線程之間存在依賴關係?那麼當然你必須爲它們使用相同的令牌 - 並且使用字典毫無意義...... – 2015-02-11 16:10:15

回答

15

通常,您有一個可以取消的操作CancellationTokenSource。您需要將CancellationTokenSource傳遞給需要取消操作(cts.Cancel())及其CancellationTokencts.Token)的所有人,以便所有需要注意取消操作的人員操作。

在這個抽象層次上,你不會停止線程;你停止操作。線程僅僅是實現細節。

因此,我不認爲將令牌映射到線程是一個好主意。如果涉及任務,這是一個非常糟糕的主意,因爲不能保證每個任務實際上都在新線程上運行。

+0

好吧,那麼您通常如何將取消令牌映射到操作? – Hristo 2015-02-11 16:24:01

+0

例如,說我想停止一個操作A執行,我有它的取消令牌與另外10個來自其他操作的取消令牌。將正在執行的操作鏈接到取消標記的正確方法是什麼? – Hristo 2015-02-11 16:26:39

+0

@克里斯你沒有,這就是要點。你*作爲參數傳遞給方法。方法或者在每個循環步驟之後檢查它,或者添加一個事件處理程序給Cancel事件,以便在取消時執行他們想做的任何事情 – 2015-02-11 16:26:40