Lea*_*ner 3 c# task-parallel-library
我写了以下代码:
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);
Run Code Online (Sandbox Code Playgroud)
在这里我取消任务然后状态显示RanToCompletion但是如果我删除等待两个任务,那么它显示我取消状态...
因为我要取消这项任务,我期待在任何情况下取消的状态......
编辑:从MSDN通过抛出OperationCanceledException并向其传递请求取消的令牌.执行此操作的首选方法是使用ThrowIfCancellationRequested方法.以这种方式取消的任务转换为Canceled状态,调用代码可以使用该状态来验证任务是否响应了其取消请求.
如果您不使用Wait或WaitAll方法等待任务,则该任务仅将其状态设置为Canceled.
当您捕获OperationCanceledException并突破while循环时,任务正在优雅地结束,任务状态将是RanToCompletion.
为了获得"已取消"状态,您需要重新抛出OperationCanceledException或者根本不捕获它.
根据MSDN,任务状态将在以下时间取消:
任务通过在令牌处于信号状态时抛出具有自己的CancellationToken的OperationCanceledException来确认取消,或者在任务开始执行之前已经发出任务的CancellationToken信号.有关更多信息,请参阅任务取消.
由于您在源代码中吞下了异常,因此任务状态将是RanToCompletion.
要在删除等待时回答有关为什么取消状态的问题,可能是因为尚未捕获异常并且已在较早时间检查取消状态.不应认为此行为可靠且可重复.
| 归档时间: |
|
| 查看次数: |
2900 次 |
| 最近记录: |