Tra*_*uy9 88 c# task-parallel-library
所以我最近被告知我如何使用我的.ContinueWith for Tasks并不是使用它们的正确方法.我还没有在互联网上找到这方面的证据,所以我会问你们,看看答案是什么.这是我如何使用的例子.ContinueWith:
public Task DoSomething()
{
return Task.Factory.StartNew(() =>
{
Console.WriteLine("Step 1");
})
.ContinueWith((prevTask) =>
{
Console.WriteLine("Step 2");
})
.ContinueWith((prevTask) =>
{
Console.WriteLine("Step 3");
});
}
Run Code Online (Sandbox Code Playgroud)
现在我知道这是一个简单的例子,它运行得非常快,但只是假设每个任务都进行了更长时间的操作.所以,我被告知在.ContinueWith中,你需要说prevTask.Wait(); 否则你可以在上一个任务完成之前完成工作.这甚至可能吗?我假设我的第二个和第三个任务只会在前一个任务完成后运行.
我被告知如何编写代码:
public Task DoSomething()
{
return Task.Factory.StartNew(() =>
{
Console.WriteLine("Step 1");
})
.ContinueWith((prevTask) =>
{
prevTask.Wait();
Console.WriteLine("Step 2");
})
.ContinueWith((prevTask) =>
{
prevTask.Wait();
Console.WriteLine("Step 3");
});
}
Run Code Online (Sandbox Code Playgroud)
Dre*_*rsh 116
呃....我认为目前的一些答案缺少一些东西:例外会发生什么?
你继续调用的唯一原因Wait是观察延续本身中前因的潜在异常.如果您Result在a的情况下访问Task<T>并且手动访问该Exception属性,则会发生相同的观察.坦率地说,我不打电话Wait或访问,Result因为如果有例外,你将支付重新筹集的费用,这是不必要的开销.相反,你可以检查IsFaulted先前的财产Task.或者,您可以通过链接多个同级延续来创建分叉工作流,这些延续仅基于成功或失败使用TaskContinuationOptions.OnlyOnRanToCompletion和来触发TaskContinuationOptions.OnlyOnFaulted.
现在,没有必要在延续中观察前提的例外情况,但是如果"步骤1"失败,您可能不希望您的工作流程向前推进.在这种情况下:指定TaskContinuationOptions.NotOnFaulted您的ContinueWith调用将阻止连续逻辑永远触发.
请记住,如果您自己的延续没有观察到异常,那么等待整个工作流程完成的人将成为观察它的人.无论是他们是Wait在Task上游,还是已经坚持自己的继续,以了解它何时完成.如果是后者,他们的继续将需要使用上述观察逻辑.
And*_*rpi 20
您正确使用它.
创建在目标任务完成时异步执行的延续.
来源:Task.ContinueWith方法(作为MSDN的行动)
必须调用prevTask.Wait()每次Task.ContinueWith调用似乎都是一种重复不必要的逻辑的奇怪方式 - 即做一些"超级确定"的事情,因为你实际上并不了解某些代码的作用.就像检查一个null只是为了扔掉ArgumentNullException它本来会抛出的地方.
所以,不,谁告诉你这是错的,可能不明白为什么Task.ContinueWith存在.
ken*_*n2k 16
谁告诉你的?
引用MSDN:
创建在目标任务完成时异步执行的延续.
另外,如果没有等待上一个任务完成,继续使用的目的是什么?
你甚至可以自己测试一下:
Task.Factory.StartNew(() =>
{
Console.WriteLine("Step 1");
Thread.Sleep(2000);
})
.ContinueWith((prevTask) =>
{
Console.WriteLine("I waited step 1 to be completed!");
})
.ContinueWith((prevTask) =>
{
Console.WriteLine("Step 3");
});
Run Code Online (Sandbox Code Playgroud)