私は次のコードを書きました:
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 が表示されますが、両方のタスクの待機を削除すると、キャンセルされたステータスが表示されます...
タスクをキャンセルしているので、いずれにしてもキャンセルされたステータスを期待しています...
EDIT : From MSDN OperationCanceledException をスローし、キャンセルが要求されたトークンを渡します。これを行うには、ThrowIfCancellationRequested メソッドを使用することをお勧めします。この方法でキャンセルされたタスクは Canceled 状態に遷移し、呼び出し元のコードはこれを使用して、タスクがキャンセル要求に応答したことを確認できます。
Wait メソッドまたは WaitAll メソッドを使用してタスクを待機しない場合、タスクはそのステータスを単に Canceled に設定します。