c# - Task.Factory.StartNew 中的异步方法在继续之前等待所有任务
问题描述
我有以下代码:
public async Task<bool> ExecuteAsync()
{
return await someresult;
}
public async Task DoSomethingAsync()
{
var tasks = new List<Task>();
foreach (var item in someList)
{
var task = Task.Factory.StartNew(async () =>
{
await ExecuteAsync();
});
tasks.Add(task);
}
await Task.WhenAll(tasks);
// The program execution should stop here and next code should be run when all tasks are completed
}
基本上我在一个 foreach 循环中,我为每个项目启动一个新任务。
一旦所有任务都启动,我希望在await Task.WhenAll(tasks);
所有任务完成后执行代码。当然所有都是异步的,因此我想知道这是否可能?因为所有都是异步的,所以执行不会在 Task.WhenAll(tasks) 处停止,而是会继续,即使并非所有任务都已完成。我怎样才能解决这个问题?
解决方案
首先,为什么你要为循环中的每个任务浪费线程池,你的代码可以写成:
public Task<bool> ExecuteAsync()
{
return ItReturnsATask();
}
public async Task DoSomethingAsync()
{
var tasks = new List<Task>();
foreach (var item in someList)
{
//ExecuteAsync can be replace by ItReturnsATask if there's no extra processing
tasks.Add(ExecuteAsync());
}
await Task.WhenAll(tasks);
}
您的代码错过了异步点,它从线程池创建了几个线程,并使用它们,这些线程在这里浪费了。至于您的实际问题,await Task.WhenAll(tasks)
在所有任务完成之前都不会执行之后的任何操作(假设我们正在捕获当前上下文)。
推荐阅读
- google-cloud-platform - 如何查看 Google Cloud Function 实例使用的 IP 地址?
- android - Google play:突出披露中缺少信息
- python - 在 python tkinter 中销毁 GUI 窗口
- javascript - 为什么我用来显示/隐藏 div 的 javascript 在 IE 中不起作用?
- html - 响应式配置器的问题
- kubernetes - Kubernetes Service ping 不时工作“名称解析暂时失败”
- bash - 获取子网 ID AWS
- r - 枢轴加宽表 dyplr R
- intel - mem_load_uops_retired.l3_miss 和 offcore_response.demand_data_rd.l3_miss.local_dram 事件之间的区别
- javascript - fullcalendar 通过悬停在当天添加工具提示