Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非异步执行路径能否以“异步”形式返回同步结果;异步;方法_C#_Asynchronous_Async Await_Task - Fatal编程技术网

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