public async ValueTask<bool> AssetExistsForDeletion(int id, CancellationToken token)
{
return await fileDbContext.File.Where(x => x.Id == id
&& x.ParentFileId == null
&& x.IsDeleted == false)
.CountAsync(token) > 0 ? true : false;
}
我可以在只返回任务的情况下以某种方式从这里删除 async/await 吗?
答案 0 :(得分:1)
老实说,我可能只是在这里使用 await
,但是如果您认为下游操作很有可能经常同步完成(可能是因为缓存),您确实可以避免 {{ 1}}- 这里概括
await
这在同步成功的情况下完全绕过了异步机制,同时仍然可以在不完整的异步操作和异常情况下正常工作。
您可能还会发现 ValueTask<book> Foo()
{
ValueTask<int> pending = yourAwaitableQueryHere; // ... blah.CountAsync(...);
return pending.IsCompletedSuccessfully
? new(pending.Result > 0) : Awaited(pending);
static async ValueTask<bool> Awaited(ValueTask<int> pending)
=> (await pending) > 0;
}
有时会胜过 .Count(predicate)
(有或没有异步)。
答案 1 :(得分:-3)
await
最初只是语法糖,因此您可以自己明确地编写代码:
public ValueTask<bool> AssetExistsForDeletion(int id, CancellationToken token)
{
return fileDbContext.File./* ... */CountAsync(token)
.ContinueWith(t => t.Result > 0);
}
这将正常创建并启动初始任务(您的 EF.Core 查询),然后设置一个延续以根据原始任务的结果返回结果。同样,代码 await
将生成。