尝试只返回没有异步/等待的任务

时间:2021-04-14 17:18:35

标签: c# .net asynchronous

    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 吗?

2 个答案:

答案 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 将生成。

相关问题