调用异步方法时,只要不等待结果,就可以在等待结果之前做其他事情。像这样:
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;
}
答案 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)
我认为可以得出以下结论: 由于代码可以构建,因此这里没有明显的副作用,不会发生任何错误。我们绝对可以调用异步方法,但是永远不要等待获取结果。但是,这浪费资源,唯一的好处是它可以为创建请求的人节省一些处理时间。但这应避免,因为这不是最佳做法。
如果您同意,请对该答案进行投票,我将根据投票数决定将其标记为答案。