首页 > 解决方案 > 如何使用异步 lamda 作为参数创建新的通用任务

问题描述

我需要创建一个新的通用任务,它采用异步 lambda 但不会立即开始。这就是为什么我不能使用Task.Run并且我想实例化一个新任务的原因。我不能这样做,因为 C# 给了我以下错误:

无法将异步 lambda 表达式转换为委托类型Func<int>。异步 lambda 表达式可能会返回或void,其中任何一个都不能转换为TaskTask<T>Func<int>

我的代码是

Task<int> task = new Task(async () => {
    var number = await getNextNumber();
    return await algorithm(number);
});

标签: c#task

解决方案


我需要创建一个新的通用任务,它采用异步 lambda 但不会立即开始。这就是为什么我不能使用 Task.Run 并且我想实例化一个新任务的原因。

正如我在博客中解释的那样,你永远不应该使用Task构造函数。

在同步世界中,如果您想要一个可以稍后调用的对象来执行某些代码,您可以使用委托,例如,ActionFunc<T>

在异步世界中,如果您想要一个可以稍后调用的对象来执行某些代码,您可以使用委托。正如我在博客中解释的那样,异步 lambda 的委托类型与同步的不同;所以不是Action你会使用Func<Task>, 而不是Func<T>你会使用Func<Task<T>>.

Func<Task<int>> func = async () => {
    var number = await getNextNumber();
    return await algorithm(number);
};

...

int result = await func();

推荐阅读