我已經寫了下面的代碼:任務狀態時取消
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
int i = 0;
Console.WriteLine("Calling from Main Thread {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
Task t1 = new Task(() =>
{
while (true)
{
try
{
token.ThrowIfCancellationRequested();
}
catch (OperationCanceledException)
{
Console.WriteLine("Task1 cancel detected");
break;
}
Console.WriteLine("Task1: Printing: {1}", System.Threading.Thread.CurrentThread.ManagedThreadId, i++);
}
}, token);
Task t2 = new Task(() =>
{
while (true)
{
try
{
token.ThrowIfCancellationRequested();
}
catch (OperationCanceledException)
{
Console.WriteLine("Task2 cancel detected");
break;
}
Console.WriteLine("Task2: Printing: {1}", System.Threading.Thread.CurrentThread.ManagedThreadId, i++);
}
});
t1.Start();
t2.Start();
Thread.Sleep(100);
tokenSource.Cancel();
t1.Wait();//wait for thread to completes its execution
t2.Wait();//wait for thread to completes its execution
Console.WriteLine("Task1 Status:{0}", t1.Status);
Console.WriteLine("Task2 Status:{0}", t1.Status);
我在這裏取消接任務也狀態顯示RanToCompletion,但如果我在兩個任務刪除的等待,那麼就說明我取消狀態.. 。
因爲我取消了任務,我期待在任何情況下,取消狀態...
編輯:從MSDN 通過投擲OperationCanceledException並將其傳遞次請求取消的令牌。執行此操作的首選方法是使用ThrowIfCancellationRequested方法。以這種方式取消的任務轉換爲取消狀態,調用代碼可以使用該狀態來驗證任務是否響應了取消請求。
如果不使用等待或爲WaitAll方法來等待任務,該任務只是將其地位已取消。
感謝齊亞德。但是,當我刪除的任務,然後我得到它正在創造一些混亂的取消狀態等待.. –
更新從MSDN鏈接的問題:仍然搞不清我已經更新了聲明。它是否與你最後的陳述相矛盾? –
@RaoBHavik我認爲當您執行Wait時狀態爲Cancelled的事實完全是巧合。實際上,如果您替換Thread.Sleep(5000)這兩個等待,任務狀態可能會是RanToCompletion。 –