【发布时间】:2018-11-08 15:37:40
【问题描述】:
我有两个彼此不直接相关的异步方法(尽管它们都写出来了)..我不想阻止另一个的效率..
如果我将其中一个活动放在一组这样的任务中:
var list = new List<Task>();
foreach (var t in things)
{
list.Add(My.MethodAsync(t)); // method returns Task
}
await Task.WhenAll(t);
我知道它不会阻塞,并且可能并行运行..
如果我使用另一种异步方法:
var list = new List<Task>();
foreach (var t in things)
{
list.Add(My.MethodAsync(t)); // method returns Task
}
foreach (var t in things)
{
await My.OtherAsync(t)); // method returns Task
}
await Task.WhenAll(t);
Task.WhenAll() 需要等待第二个 foreach 完成...
因此,这样的事情可能/推荐吗?
var allTasks = new List<Task>();
foreach (var t in things)
{
allTasks.Add(My.MethodAsync(t)); // method returns Task
allTasks.Add(My.OtherAsync(t)); // method returns Task
}
await Task.WhenAll(t);
输入后,即使任务本身是独立的,如果两者都没有输出,我想如果引发错误会很好.. 嗯
问题仍然存在;)
【问题讨论】:
-
“Task.WhenAll() 需要等待阻塞 foreach 完成...”,不正确。任务将同时运行
-
哦,真的吗?我认为 Task.WhenAll(t) 还没有开始,并释放了主线程?它不能由于第二个 foreach 阻止它..
-
我会看看这个 reguard the exceptions。 stackoverflow.com/questions/25009437/…
-
Parallel.Invoke并行运行受 CPU 限制的操作。Task.WhenAll和Task.WaitAll等待所有任务完成。不过,您仍然需要先启动它们。如果MethodAsync和OtherAsync返回已启动的任务,您的第二个示例就可以了。 -
@m1nkeh 你会打电话给
task.Start()
标签: c# async-await