c# - 如何使用异步 lamda 作为参数创建新的通用任务
问题描述
我需要创建一个新的通用任务,它采用异步 lambda 但不会立即开始。这就是为什么我不能使用Task.Run
并且我想实例化一个新任务的原因。我不能这样做,因为 C# 给了我以下错误:
无法将异步 lambda 表达式转换为委托类型
Func<int>
。异步 lambda 表达式可能会返回或void
,其中任何一个都不能转换为Task
Task<T>
Func<int>
我的代码是
Task<int> task = new Task(async () => {
var number = await getNextNumber();
return await algorithm(number);
});
解决方案
我需要创建一个新的通用任务,它采用异步 lambda 但不会立即开始。这就是为什么我不能使用 Task.Run 并且我想实例化一个新任务的原因。
正如我在博客中解释的那样,你永远不应该使用Task
构造函数。
在同步世界中,如果您想要一个可以稍后调用的对象来执行某些代码,您可以使用委托,例如,Action
或Func<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();
推荐阅读
- sql-server - 为什么我不断收到此查询错误?
- python-3.x - 熊猫数组到列(需要将字母转换为单词)
- java - 无法解析符号'@+id/editName
- python - 如何在 Python 中确定对象的值
- tensorflow - 我们在 YOLO 的输出层使用了哪个激活函数?
- bash - 在 Bash 中使用 Expect 创建用于用户身份验证的 SSH 密钥对
- python - 为什么从 NumPY 数组中读取 CDF 文件的速度如此之慢
- angularjs - 使用 `ng-repeat` 制作一个 8x8 大小的表格
- github - 让任何人在未经审查的情况下推送到 Github 上的分支
- c# - 如何使用带有 pin 码的 USB 令牌对字节进行签名?