C# Task.WaitAll与序列化Task.results?
忽略异步/等待解决方案这两组代码之间有什么区别吗?在这种情况下,你真的需要Task.WaitAll吗?省略它会有任何负面后果吗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
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
中,您将知道哪个任务引发了异常,并且可以有单独处理它们的机制。因此,不必担心上述上下文导致的死锁。