我正在编写一段使用.FirstOrDefaultAsync()
LINQ
方法的代码。我知道,通常如果您在具有none异步方法的表达式中使用它,则之后使用?
会返回而不评估其余方法调用。
例如 Suedo代码
class Item = {
string Name
string Value
}
items = Item[]
var result = items.FirstOrDefault(item => item.Name == "Item One")?.Value;
如果list
不包含名称为“ Item One”的item
,则结果将为null
,并且不会抛出exception
,因为{ {1}}没有属性null
。
我想异步执行相同的操作,这项工作会完成吗:
Value
如果找不到这样的项目,是否会返回而不评估list.FirstOrDefaultAsync(item => item.Name == "Item One")?
.ContinueWith(result => result.Result.Value);
?还是ContinueWith()
不能以这种方式异步工作?
答案 0 :(得分:1)
对于异步方法,您必须使用括号()
var result =(await list.FirstOrDefaultAsync(item => item.Name == "Item One"))?.Value
:)
答案 1 :(得分:1)
您显示的代码无效,因为它正在检查Task
返回的FirstOrDefaultAsync
是否为空-永远不会为空。另外,ContinueWith
正在过度使用,因为其主要用途是链接异步操作。提取值不是异步的,所以为什么不
var item = await list.FirstOrDefaultAsync(item => item.Name == "Item One");
var result = item?.Value;
如果愿意,可以单行
var result = (await list.FirstOrDefaultAsync(item => item.Name == "Item One"))?.Value;