【发布时间】:2016-02-23 13:22:01
【问题描述】:
我需要调用我的 Task 对象的一个方法。我的任务执行某种读取,如果完成时间超过 2 秒,我将取消该操作。
我有这个代码作为模拟:
var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(2000));
var task = Task.Run(() =>
{
try
{
int i = 0;
while (true)
{
Thread.Sleep(500);
cts.Token.ThrowIfCancellationRequested();
Console.WriteLine("i = {0}", i);
i++;
if (i > 3) throw new InvalidOperationException();
}
}
catch (Exception e)
{
Console.WriteLine("Exception {0}", e.Message);
throw;
}
});
task.ContinueWith(t => Console.WriteLine(t.Status), TaskContinuationOptions.NotOnRanToCompletion);
我的控制台输出如下:
这是我所期望的并且对我有用。如果我复制任务内的代码并创建一个方法,我不再将任务状态设为已取消。我的状态为故障。我必须知道操作是否被取消或读取过程中发生异常。我无法弄清楚为什么我没有在此处获得“已取消”的任务状态。
var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(2000));
var task = Task.Run(() =>
{
try
{
Tester(cts);
}
catch (Exception e)
{
Console.WriteLine("Exception {0}", e.Message);
throw;
}
});
private static void Tester(CancellationTokenSource cts)
{
int i = 0;
while (true)
{
Thread.Sleep(500);
cts.Token.ThrowIfCancellationRequested();
Console.WriteLine("i = {0}", i);
i++;
if (i > 3) throw new InvalidOperationException();
}
}
【问题讨论】:
标签: c# c#-4.0 task-parallel-library