【发布时间】:2023-03-14 00:48:01
【问题描述】:
我有以下代码,使用异步方法在 R 和 L 类型之间转换项目:
class MyClass<R,L> {
public async Task<bool> MyMethodAsync(List<R> remoteItems) {
...
List<L> mappedItems = new List<L>();
foreach (var remoteItem in remoteItems )
{
mappedItems.Add(await MapToLocalObject(remoteItem));
}
//Do stuff with mapped items
...
}
private async Task<L> MapToLocalObject(R remoteObject);
}
这是否可以使用 IEnumerable.Select 调用(或类似调用)来减少代码行数?我试过这个:
class MyClass<R,L> {
public async Task<bool> MyMethodAsync(List<R> remoteItems) {
...
List<L> mappedItems = remoteItems.Select<R, L>(async r => await MapToLocalObject(r)).ToList<L>();
//Do stuff with mapped items
...
}
}
但我得到错误:
"无法将异步 lambda 表达式转换为委托类型
'System.Func<R,int,L>'。异步 lambda 表达式可能返回void,Task或Task<T>,它们都不能转换为'System.Func<R,int,L>'。”
我相信我遗漏了关于 async/await 关键字的一些内容,但我不知道是什么。有没有人知道我可以如何修改我的代码以使其正常工作?
【问题讨论】:
-
应该可以,不指定类型参数试试?
-
@ofstream:不,它不应该工作。错误消息对此非常具体。
-
如果我不指定类型参数 (
remoteItems.Select(async r => await MapToLocalObject(r)).ToList()),我会得到一个List<Task<L>>>,这不是我想要的。 -
啊,我们走了。您必须返回任务,否则它不是异步方法。您需要进行两次选择,一次选择映射,然后选择 task.result,然后选择 tolist。那应该会给你一个 List
. -
@AlexFilipovici 这只会对任务进行阻塞等待,使方法不异步。
标签: c# async-await