C# Task.WaitAll与序列化Task.results?

C# Task.WaitAll与序列化Task.results?,c#,task,C#,Task,忽略异步/等待解决方案这两组代码之间有什么区别吗?在这种情况下,你真的需要Task.WaitAll吗?省略它会有任何负面后果吗 public void ExampleA() { Task<object> fooTask = _someFactory.StartFooTask(); Task<object> barTask = _someFactory.StartBarTask(); //misc code ... _fooResult

忽略异步/等待解决方案这两组代码之间有什么区别吗?在这种情况下,你真的需要Task.WaitAll吗?省略它会有任何负面后果吗

public void ExampleA()
{
    Task<object> fooTask = _someFactory.StartFooTask();
    Task<object> barTask = _someFactory.StartBarTask();

    //misc code ...

    _fooResult = fooTask.Result;
    _barResult = barTask.Result;

    //more misc code ...
}

public void ExampleB()
{
    Task<object> fooTask = _someFactory.StartFooTask();
    Task<object> barTask = _someFactory.StartBarTask();

    //misc code ...

    Task.WaitAll(fooTask, barTask);

    _fooResult = fooTask.Result;
    _barResult = barTask.Result;

    //more misc code ...
}
public void ExampleA()
{
Task FootTask=\u someFactory.startFootTask();
Task barTask=\u someFactory.StartBarTask();
//杂项代码。。。
_fooResult=fooTask.Result;
_barResult=barTask.Result;
//更多杂项代码。。。
}
公共无效示例B()
{
Task FootTask=\u someFactory.startFootTask();
Task barTask=\u someFactory.StartBarTask();
//杂项代码。。。
Task.WaitAll(fooTask,barTask);
_fooResult=fooTask.Result;
_barResult=barTask.Result;
//更多杂项代码。。。
}
示例A对我来说更有意义,尤其是在这样的情况下,可能会发生更多的计算,因为一个任务的结果可能需要比其他任务更快的结果?如果一个偶然的机会需要,实际上完成得更早

public void ExampleC()
{
    Task<object> fooTask = _someFactory.StartFooTask();
    Task<object> barTask = _someFactory.StartBarTask();

    //misc code ...

    _fooResult = fooTask.Result;

    // more misc code requiring _fooResult ...

    _barResult = barTask.Result;

    // more misc code requiring _barResult...
}
public void ExampleC()
{
Task FootTask=\u someFactory.startFootTask();
Task barTask=\u someFactory.StartBarTask();
//杂项代码。。。
_fooResult=fooTask.Result;
//更多需要_fooResult的杂项代码。。。
_barResult=barTask.Result;
//更多需要_barResult的杂项代码。。。
}

从逻辑上讲,这两种方法都将阻塞,直到
fooTask
barTask
完成

当然也有不同之处。您正在初始化和删除同步原语,但不同的是,您不会注意到任何东西

在第3段中,将出现您描述的行为。但是,如果希望同时处理结果,则应使用continuations(
Task.ContinueWith
etc)


我无法在不传递经典建议的情况下处理此代码-如果可以避免,请不要调用
Task.Wait
或使用
Task.Result
进行阻止。你的同事会讨厌你。

如果你想保证两个(全部)方法都已完成,你会使用
WaitAll
,否则第一个任务中的异常将阻止调用
。Result
或第二个任务,因此第二个方法在方法退出时可能无法完成

整体行为将非常接近

  • 抛出异常时有很小的区别(
    .whalll
    与单个
    .Result
  • 正如您所指出的,如果没有
    WaitAll
    ,您可以在
    调用之间插入一些代码
  • 两个版本都将在ASP.Net/Winforms/WPF上下文中死锁

我看到的
WaitAll
的一个问题是,如果在任何任务中出现异常,它将抛出
aggregateeexception
。而在
ExampleA
中,您将知道哪个任务引发了异常,并且可以有单独处理它们的机制。因此,不必担心上述上下文导致的死锁。