是prevTask.Wait()建议与ContinueWith使用(从任务库)?(Is prevTa

2019-06-26 23:12发布

所以,我最近告诉我如何用我的.ContinueWith的任务是不使用它们的正确方法。 我还没有在互联网上找到这方面的证据,所以我会问你们,看看答案是什么。 下面是我如何使用.ContinueWith一个例子:

public Task DoSomething()
{
    return Task.Factory.StartNew(() =>
    {
        Console.WriteLine("Step 1");
    })
    .ContinueWith((prevTask) =>
    {
        Console.WriteLine("Step 2");
    })
    .ContinueWith((prevTask) =>
    {
        Console.WriteLine("Step 3");
    });
}

现在,我知道这是一个简单的例子,它会跑得很快,但只是假设每个任务做一些较长的操作。 所以,我被告知的是,在.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");
    });
}

Answer 1:

Ehhh ....我觉得目前的一些答案,失去了一些东西:有什么异常情况?

你会打电话的唯一原因Wait的延续将是在延续自身的先行观察潜在的异常。 如果访问的同样的观察,会发生Result的的情况下, Task<T>并且还如果手动访问的Exception特性。 坦率地说,我不会把Wait或访问Result ,因为如果有一个例外,你将支付的重新认识这是不必要的开销的价格。 相反,你可以只检查IsFaulted物业断先行Task 。 另外,您可以通过链接上只有火基于成功或失败与多个兄弟延续创造分叉工作流程TaskContinuationOptions.OnlyOnRanToCompletionTaskContinuationOptions.OnlyOnFaulted

现在,它没有必要去观察在延续前期的例外,但你可能不希望您的工作流程,如果说,“第1步”未能向前推进。 在这种情况下:指定TaskContinuationOptions.NotOnFaultedContinueWith通话将防止执行逻辑从以往更射击。

请记住,如果你自己延续不遵守例外,谁在等待这个整体工作流程来完成的这个人会是观察它的人。 要么他们Wait荷兰国际集团的Task上游或已经上涨了自己延续知道它何时完成。 如果是后者,其继续将需要使用上述观察逻辑。



Answer 2:

您正确地使用它。

创建目标任务完成时执行异步延续

来源: Task.ContinueWith方法(如行动MSDN)

不必调用prevTask.Wait()在每一个Task.ContinueWith调用似乎是一个奇怪的方式重复不必要的逻辑-即做的事情是“超级骗子肯定”,因为你其实不明白的代码一定位一样。 比如检查空只是抛出一个ArgumentNullException哪里会一直所抛出。

所以,不,谁告诉你是错的,也许不明白为什么Task.ContinueWith存在。



Answer 3:

谁告诉你的?

引用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");
    });


Answer 4:

从MSDN上Task.Continuewith

返回的任务将不会被安排执行,直到当前任务已完成。 如果通过continuationOptions参数中指定的标准不符合,延续任务将被取消,而不是调度。

我认为,你期望它在第一个例子中的工作方式是正确的方法。



Answer 5:

您可能还需要考虑使用,而不是Task.Factory.StartNew Task.Run。

斯蒂芬·克利里的博客文章和斯蒂芬Toub的职位,他引用解释的差异。 还有一个在讨论这个答案 。



Answer 6:

通过访问Task.Result你实际上是在做类似的逻辑来task.wait



Answer 7:

我将重申了许多已经说过, prevTask.Wait() 是不必要的

更多的例子,一个可以去使用延续任务链的任务 ,但微软有很好的例子另一个链接。



文章来源: Is prevTask.Wait() recommended to be used with ContinueWith (from the Tasks library)?