带有异步 lambda 和 Task.WaitAll 的 Task.Factory.StartNew [英] Task.Factory.StartNew with async lambda and Task.WaitAll

查看:25
本文介绍了带有异步 lambda 和 Task.WaitAll 的 Task.Factory.StartNew的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对任务列表使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆