gpt4 book ai didi

c# - 非异步执行路径能否在 "async"方法中返回同步结果

转载 作者:行者123 更新时间:2023-12-04 16:37:39 25 4
gpt4 key购买 nike

考虑以下方法:

public async Task<string> GetNameOrDefaultAsync(string name)
{
if (name.IsNullOrDefault())
{
return await GetDefaultAsync();
}

return name;
}

当提供name时,方法执行时不会发生等待,但该方法将正确编译。

但是,此方法会产生如下所示的构建警告:

public async Task<string> GetDefaultAsync()
{
return "foobar";
}

[CS1998] 此异步方法缺少“await”运算符,将同步运行。考虑使用“await”运算符等待非阻塞 API 调用,或使用“await Task.Run(...)”在后台线程上执行 CPU 绑定(bind)工作。

为什么 GetNameOrDefaultAsync 可以在不等待的情况下返回,并且不会导致编译器警告,但 GetDefaultAsync 必须等待才能编译?

执行以下操作会有所改进吗?

public async Task<string> GetNameOrDefaultAsync(string name)
{
if (name.IsNullOrDefault())
{
return await GetDefaultAsync();
}

return await Task.FromResult(name);
}

在这里,我们将没有不await something 的执行路径。

最佳答案

Why is it that GetNameOrDefault can return without ever awaiting, and not result in a compiler warning

因为有些执行路径确实使用了await ,并能够使用 await该方法需要是 async .

另一方面,如果没有路径使用await , async关键字显然是多余的,因此发出警告。

Would it be an improvement to do the following?return await Task.FromResult(name);

不,Task.FromResult简单地包装 nameTask对象,处于完成状态,表示 await立即再次打开它。

这分配了一个 Task不必要的,并且一无所获。


顺便说一句,如果name.IsNullOrDefault()几乎总是 false ,即使用 await是异常(exception)而不是规则,您可以使用 ValueTask 减少分配相反:Why would one use Task<T> over ValueTask<T> in C#?

关于c# - 非异步执行路径能否在 "async"方法中返回同步结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67437357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com