【发布时间】:2017-08-28 01:29:08
【问题描述】:
在微软70-483考试使用CancellationToken的参考书中,第一种用信号取消的方法是抛出异常,然后介绍了第二种:
除了捕获异常,您还可以添加一个延续 仅在取消任务时执行的任务。在此任务中,您 可以访问引发的异常,您可以选择 如果合适的话,处理它。示例 1-44 展示了这样一个 延续任务看起来像
这是列表 1-44:
Task task = Task.Run(() =>
{
while (!token.IsCancellationRequested)
{
Console.Write("*");
Thread.Sleep(1000);
}
}, token).ContinueWith((t) =>
{
t.Exception.Handle((e) => true);
Console.WriteLine("You have canceled the task");
}, TaskContinuationOptions.OnlyOnCanceled);
这是我完整的 Main 方法代码:
static void Main(string[] args)
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
var token = cancellationTokenSource.Token;
Task task = Task.Run(() =>
{
while (!token.IsCancellationRequested)
{
Console.Write("*");
Thread.Sleep(1000);
}
}, token).ContinueWith((t) =>
{
t.Exception.Handle((e) => true);
Console.WriteLine("You have canceled the task");
}, TaskContinuationOptions.OnlyOnCanceled);
Console.ReadLine();
cancellationTokenSource.Cancel();
task.Wait();
Console.ReadLine();
}
但是,与它所说的不同,当我按下 Enter 键时,异常 (AggregationException) 仍然在 task.Wait() 调用处抛出到 Main 方法。此外,如果我删除该调用,第二个任务将永远不会运行(不会引发异常)。有什么我做错了吗?不使用try-catch是否可以处理异常?
【问题讨论】:
标签: c# .net asynchronous task