调用异步方法时是否必须调用await?

时间:2019-05-22 19:18:26

标签: c# async-await

调用异步方法时,只要不等待结果,就可以在等待结果之前做其他事情。像这样:

var resultTask = GetResultAsync();
//Do something else
var result = await resultTask;

我想知道是否跳过以等待结果,这会引起副作用吗?

var resultTask = GetResultAsync();
if(GetSomeOtherBooleanValueMethod()){
    var result = await resultTask;
}else{
    //Some other logic here.
    //await resultTask will never happen in this block.
    return;
}

4 个答案:

答案 0 :(得分:1)

  

会引起任何副作用吗?

它导致的结果是您的应用程序永远无法知道GetResultAsync何时完成。

尤其是:

  • 您的代码将不知道GetResultAsync是否失败。
  • GetResultAsync仍在运行时,您的代码可能会认为自己已经“完成”。如果您的应用程序退出,GetResultAsync将被中止。再次,没有任何通知。

第二点在ASP.NET之类的服务器框架上尤其成问题,如果它“完成”了,它可能会卸载您的进程,因此如果GetResultAsync正在运行,则会终止它。

答案 1 :(得分:0)

唯一的副作用是它将不会在任何时候等待GetResultsAsync()的调用。即使您想同时在if语句中和之后使用result,也可以多次等待相同的任务。

var resultTask = GetResultAsync();

ResultType result;
if(GetSomeOtherBooleanValueMethod()){
   result = await resultTask;
}else{
    //Some other logic here.
    //await resultTask will never happen in this block.
}
result = await resultTask; 

答案 2 :(得分:0)

这完全取决于GetResultAsync();的工作。我基于它的名称猜测,它所做的只是从Web服务或数据库中检索值。话虽这么说,

  • GetResultAsync()实际上没有任何副作用
  • 您不在乎else情况下的结果
  • GetResultAsync()方法并未占用某种共享或稀缺资源或某些东西
  • 在其他情况下,GetResultAsync()可能会导致争用条件,如果其他条件取决于它在运行前是否完成。例如,如果提早终止进程(例如,通过退出控制台应用程序等)可能导致GetResultAsync()处于破坏状态,那么这将是一个问题。

那没有问题。

第三点值得一提,因为如果是这种情况,可能会导致竞争状况。广义上讲,“共享资源”可以是任何文件,从文件句柄到API速率限制。

更广泛的一点是,如果您执行这样的操作,则必须考虑可能导致比赛状况的任何情况。

答案 3 :(得分:-2)

我认为可以得出以下结论: 由于代码可以构建,因此这里没有明显的副作用,不会发生任何错误。我们绝对可以调用异步方法,但是永远不要等待获取结果。但是,这浪费资源,唯一的好处是它可以为创建请求的人节省一些处理时间。但这应避免,因为这不是最佳做法。

如果您同意,请对该答案进行投票,我将根据投票数决定将其标记为答案。