2014-02-24 50 views
1

我有以下代碼:取消工作項目開始ThreadPool.RunAsync

var op = ThreadPool.RunAsync(delegate { _model.HeapSort(); }); 

有沒有辦法阻止這個線程,例如,當我把一個「取消」按鈕?我試過op.Cancel(),但似乎沒有發生。

+1

假設'HeapSort'也沒有實現取消,不是真的,不。 – Servy

+0

謝謝,那麼我會嘗試使用'任務'。 – Daniel

+0

您也會遇到完全相同的問題,原因完全相同。 – Servy

回答

0

在實現HeapSort時,必須有一個標誌來停止當前線程。

如果你正在做的,例如一個循環:

while(!cancelThread) 
{ 
    ... // Your iterative sort algorithm here 
} 

然後,如果你設置cancelThread變量真正,那麼你的線程將結束。 CancellationToken結構用於這種線程控制。

+1

'CancellationToken'不僅僅是一個布爾標誌。最重要的是,它確保正確的同步技術,以便將標記標記爲已取消時,實際上將從另一個線程讀取時「實現」。當使用普通的'bool'時,這是一件容易忽略的事情,並且會導致相當大的問題。 – Servy

+0

@Servy,沒錯。只要提出這個想法,你知道。 –

0

ThreadPool.RunAsync接受WorkItemHandler類型的委託:

public delegate void WorkItemHandler(IAsyncAction operation) 

IAsyncActionIAsyncInfo衍生它的唯一參數。有IAsyncInfo.Status屬性。當我調用IAsyncInfo.Cancel(未測試)時,我認爲它設置爲AsyncStatus.Canceled

因此,您可以定期檢查您的代表內是否有operation.Status == AsyncStatus.Canceled,並丟棄OperationCancelledException