我有以下代碼:取消工作項目開始ThreadPool.RunAsync
var op = ThreadPool.RunAsync(delegate { _model.HeapSort(); });
有沒有辦法阻止這個線程,例如,當我把一個「取消」按鈕?我試過op.Cancel()
,但似乎沒有發生。
我有以下代碼:取消工作項目開始ThreadPool.RunAsync
var op = ThreadPool.RunAsync(delegate { _model.HeapSort(); });
有沒有辦法阻止這個線程,例如,當我把一個「取消」按鈕?我試過op.Cancel()
,但似乎沒有發生。
在實現HeapSort時,必須有一個標誌來停止當前線程。
如果你正在做的,例如一個循環:
while(!cancelThread)
{
... // Your iterative sort algorithm here
}
然後,如果你設置cancelThread變量真正,那麼你的線程將結束。 CancellationToken
結構用於這種線程控制。
'CancellationToken'不僅僅是一個布爾標誌。最重要的是,它確保正確的同步技術,以便將標記標記爲已取消時,實際上將從另一個線程讀取時「實現」。當使用普通的'bool'時,這是一件容易忽略的事情,並且會導致相當大的問題。 – Servy
@Servy,沒錯。只要提出這個想法,你知道。 –
ThreadPool.RunAsync
接受WorkItemHandler
類型的委託:
public delegate void WorkItemHandler(IAsyncAction operation)
IAsyncAction
從IAsyncInfo
衍生它的唯一參數。有IAsyncInfo.Status
屬性。當我調用IAsyncInfo.Cancel
(未測試)時,我認爲它設置爲AsyncStatus.Canceled
。
因此,您可以定期檢查您的代表內是否有operation.Status == AsyncStatus.Canceled
,並丟棄OperationCancelledException
。
假設'HeapSort'也沒有實現取消,不是真的,不。 – Servy
謝謝,那麼我會嘗試使用'任務'。 – Daniel
您也會遇到完全相同的問題,原因完全相同。 – Servy