带有异步 lambda 和 Task.WaitAll 的 Task.Factory.StartNew [英] Task.Factory.StartNew with async lambda and Task.WaitAll
问题描述
我正在尝试对任务列表使用 Task.WaitAll
.问题是任务是一个异步 lambda,它打破了 Tasks.WaitAll
因为它从不等待.
I'm trying to use Task.WaitAll
on a list of tasks. The thing is the tasks are an async lambda which breaks Tasks.WaitAll
as it never waits.
这是一个示例代码块:
List<Task> tasks = new List<Task>();
tasks.Add(Task.Factory.StartNew(async () =>
{
using (dbContext = new DatabaseContext())
{
var records = await dbContext.Where(r => r.Id = 100).ToListAsync();
//do long cpu process here...
}
}
Task.WaitAll(tasks);
//do more stuff here
由于异步 lambda,这不会等待.那么我应该如何在我的 lambda 中等待 I/O 操作?
This doesn't wait because of the async lambda. So how am I supposed to await I/O operations in my lambda?
推荐答案
Task.Factory.StartNew
无法识别 async
委托,因为没有重载接受函数返回一个 Task
.
Task.Factory.StartNew
doesn't recognise async
delegates as there is no overload that accepts a function returning a Task
.
这加上其他原因(请参阅StartNew 很危险)是您应该在此处使用 Task.Run
:
This plus other reasons (see StartNew is dangerous) is why you should be using Task.Run
here:
tasks.Add(Task.Run(async () => ...
这篇关于带有异步 lambda 和 Task.WaitAll 的 Task.Factory.StartNew的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!