昨天我问了一个question,答案很好。但是现在我想了解await
的作用以及任务执行的工作方式。有和没有等待操作员的任务执行
我读过关于await
:await运算符应用于异步方法中的任务,以挂起方法的执行,直到等待完成的任务完成。该任务代表正在进行的工作(来自msdn网站)。
Task.run
:Run方法允许您在单个方法调用中创建和执行任务,并且是对StartNew方法(来自msdn站点)的简单替代方案。
现在,随着代码:
public async Task YourFunc()
{
Exception error = null;
try
{
var task = Task.Run(() =>
{
Thread.Sleep(3000);
throw new ArgumentException("test argument exception");
});
var completed = task.IsCompleted;
var faulted = task.IsFaulted;
Console.WriteLine(completed);
Console.WriteLine(faulted);
}
catch (Exception ex)
{
error = ex;
}
this.MigrationProcessCompleted(error);
}
我已经删除了的await操作,我已经设置断点上线Console.WriteLine(completed);
。为什么即使在这个断点等待2-3分钟后,任务也没有完成,没有出错?我给自己定任务的代码和内部断点例外是trown,所以任务必须被标记为故障或至少完成...
你在2-3分钟后检查什么?'task.IsFaulted'或简单的'faulted'变量在3分钟前对这个值进行采样? –
task.IsFaulted –
没有等待,Task完成比YourFunc退出的时间晚了很多,所以尝试抓取并且实际上整个方法完全没用。完成和错误都是错误的,因为在你点击它们的那一刻,任务还没有完成或者出错。至于断点 - 所有线程在断点处暂停,所以无论等待多长时间 - 任务仍在进行中。 – Evk