C# 非异步执行路径能否以“异步”形式返回同步结果;异步;方法
考虑以下方法:C# 非异步执行路径能否以“异步”形式返回同步结果;异步;方法,c#,asynchronous,async-await,task,C#,Asynchronous,Async Await,Task,考虑以下方法: 公共异步任务GetNameOrDefaultAsync(字符串名称) { if(name.IsNullOrDefault()) { 返回等待GetDefaultAsync(); } 返回名称; } 如果提供了name,则在方法执行过程中将不会发生等待,但此方法将正确编译 但是,此方法将生成如下所示的生成警告: 公共异步任务GetDefaultAsync() { 返回“foobar”; } [CS1998]此异步方法缺少'wait'运算符,将同步运行。考虑使用“Acess”操作
公共异步任务GetNameOrDefaultAsync(字符串名称)
{
if(name.IsNullOrDefault())
{
返回等待GetDefaultAsync();
}
返回名称;
}
如果提供了name
,则在方法执行过程中将不会发生等待,但此方法将正确编译
但是,此方法将生成如下所示的生成警告:
公共异步任务GetDefaultAsync()
{
返回“foobar”;
}
[CS1998]此异步方法缺少'wait'运算符,将同步运行。考虑使用“Acess”操作符等待非阻塞API调用,或“等待任务.Run(…)”在后台线程上执行CPU绑定的工作。< /代码> < /P>
为什么GetNameOrDefaultAsync
可以在不等待的情况下返回,并且不会导致编译器警告,但是GetDefaultAsync
必须等待才能编译
执行以下操作是否是一种改进
公共异步任务GetNameOrDefaultAsync(字符串名称)
{
if(name.IsNullOrDefault())
{
返回等待GetDefaultAsync();
}
返回等待任务。FromResult(名称);
}
在这里,我们没有不等待的执行路径
为什么GetNameOrDefault
可以在不等待的情况下返回,并且不会导致编译器警告
由于存在使用await
的执行路径,并且为了能够使用await
方法,需要使用async
另一方面,如果没有使用await
的路径,那么async
关键字显然是多余的,因此会发出警告
执行以下操作是否是一种改进?
返回等待任务。FromResult(名称)代码>
不,Task.FromResult
只需将name
包装到一个Task
对象中,该对象处于完成状态,这意味着wait
会立即再次将其展开
这不必要地分配了任务
,但一无所获
另一方面,如果name.IsNullOrDefault()
几乎总是false
,即使用wait
是例外而不是规则,则可以使用ValueTask
来减少分配:这不是编译错误,只是警告您可能做了一些不想做的事情。永远不要等待一个异步调用,比如火灾,如果这是您真正想要的,那么忘记操作是可以的。@Crowcoder感谢您的澄清。我更新了问题,指定它是警告,而不是错误。关于不等待,我不会认为这是一个火灾,忘记操作,因为我们关心字符串结果,我们将等待,同时消费<代码> GETNAMEORDEFAUTTASYNC