是否等待Task.Run始终等待回复

时间:2017-07-10 09:34:41

标签: c# asp.net-web-api async-await

我试图在我的控制器中实现await Task.Run,​​然后返回响应。

只是好奇在我们尝试返回之前是否总是得到回应。

            var response = await Task.Run(() => _myService.GetResponse(refno));
            return Ok(response);

它是否可以尝试返回尚未设置的响应?

由于

2 个答案:

答案 0 :(得分:3)

Task.Run将立即返回未完成的任务。等待你等待任务完成而不阻塞你的线程。只有当_myService.GetResponse(refno))返回或抛出异常时,任务才会完成。

简而言之: 当您点击第二行时,您的响应将始终设置。但_myService.GetResponse(refno)可能会引发异常。在这种情况下,异常将被重新抛出,您将无法到达第二行。

答案 1 :(得分:3)

var response = await Task.Run(() => _myService.GetResponse(refno));
return Ok(response);
  

它是否会尝试返回尚未设置的响应?

没有;从代码中可以看出,response在返回之前已分配给它。实际上,C#不会让你使用未分配的变量;这是其类型安全的一部分。

但是,你永远不应该这样做! There's no benefit to doing await Task.Run on ASP.NET

如果您可以将GetResponse更改为异步,请执行以下操作:

var response = await _myService.GetResponseAsync(refno);
return Ok(response);

否则,只需同步调用它:

var response = _myService.GetResponse(refno);
return Ok(response);