2013-08-31 62 views
0

我一個有一個第三方的任務在下面的代碼運行:如何取消第三方任務?

var ts = new CancellationTokenSource(); 
var ct = ts.Token; 

var node = Task<IResponseAdapter>.Factory.StartNew(() => 
{ 
    return NewRequest(n.RequestClass, n.MinCommission, n.MaxCommission).Submit(); 

}, ct); 

正如你所看到的,方法調用是任務和整個存在的理由任務裏面裏面的唯一的事情就是讓我可以取消它,如果超時。許多第三方方法是按順序運行的,所以監視不正確/不響應的作業並終止它們以便下一個作業運行很重要。

其他地方在我的代碼我有

var completed = task.Wait(timeoutValue); 

if(!completed) tokensource.Cancel(); 

不過,我相信這實際上並沒有取消任務,並且只提供了訪問它的方法。

那麼如何阻止第三方webservice方法運行?

+0

[*我如何取消不可取消的異步操作?](http://blogs.msdn.com/b/pfxteam/archive/2012/10/05/how-do-i-cancel-non- cancelable-async-operations.aspx)應該回答你的問題。 (破壞者:你不能) – svick

+0

有沒有其他的方式來處理這個問題,比如線程加入和中止? – dotnetnoob

+0

線程連接並不取消任何內容。線程中止是非常危險的,真的不應該使用。 – svick

回答

1

您當然無法停止已經在另一臺計算機上運行的方法(通過web服務)。任務的取消標記只能在標記設置時停止任務的開始。一旦任務開始後,就沒有辦法回到Thread.Abort應該(幾乎)永遠不會使用的原因。

+0

有些情況下實際需要中止工作。該代碼運行許多第三方方法從供應商處獲取數據。如果供應商的工作在一段時間內沒有響應,它會停止整個過程,因此需要進行監控並在必要時處理掉。 – dotnetnoob

+1

取消總是合作。唯一允許的「硬殺」是終止整個過程。這是安全的。在其他所有情況下,您都需要*建立合作取消機制。那有意義嗎? – usr

+0

我同意,但由於我無法影響供應商代碼,因此我只能自己動手。因此,如果我沒有任何方法可以殺死他們在web服務中構建的供應商的工作,唯一的辦法就是完全停止這項工作。 – dotnetnoob