我试图在我的Web API项目中使用ASP.NET的async/await功能。我不太确定这是否会对我的Web API服务的性能产生任何影响。请从我的应用程序下面找到工作流程和示例代码。

工作流程:

UI应用程序→Web API端点( Controller )→Web API服务层中的调用方法→调用另一个外部Web服务。 (这里有数据库交互等)

Controller :

public async Task<IHttpActionResult> GetCountries()
{
    var allCountrys = await CountryDataService.ReturnAllCountries();

    if (allCountrys.Success)
    {
        return Ok(allCountrys.Domain);
    }

    return InternalServerError();
}

服务层:
public Task<BackOfficeResponse<List<Country>>> ReturnAllCountries()
{
    var response = _service.Process<List<Country>>(BackOfficeEndpoint.CountryEndpoint, "returnCountries");

    return Task.FromResult(response);
}

我测试了上面的代码并且正在工作。但是我不确定async/await是否正确使用。请分享您的想法。

最佳答案



请记住,服务器端异步代码的主要好处是可伸缩性。它不会神奇地使您的请求运行得更快。我在article on async ASP.NET中介绍了几个“我应该使用async”注意事项。

我认为您的用例(调用其他API)非常适合异步代码,请记住“异步”并不意味着“更快”。最好的方法是首先使 UI 响应和异步;即使稍微慢一点,也可以让您的应用感觉更快。

就代码而言,这不是异步的:

public Task<BackOfficeResponse<List<Country>>> ReturnAllCountries()
{
  var response = _service.Process<List<Country>>(BackOfficeEndpoint.CountryEndpoint, "returnCountries");
  return Task.FromResult(response);
}

您需要一个真正的异步实现来获得async的可伸缩性优势:
public async Task<BackOfficeResponse<List<Country>>> ReturnAllCountriesAsync()
{
  return await _service.ProcessAsync<List<Country>>(BackOfficeEndpoint.CountryEndpoint, "returnCountries");
}

或(如果您在此方法中的逻辑确实只是传递):
public Task<BackOfficeResponse<List<Country>>> ReturnAllCountriesAsync()
{
  return _service.ProcessAsync<List<Country>>(BackOfficeEndpoint.CountryEndpoint, "returnCountries");
}

注意,像这样从“由内而外”工作比从“由内而外”工作更容易。换句话说,不要以异步 Controller Action 开始,然后强制下游方法是异步的。相反,请确定自然的异步操作(调用外部API,数据库查询等),然后首先在最低级别使这些异步(Service.ProcessAsync)。然后,让async滴流,最后一步使您的 Controller Action 异步。

并且在任何情况下都不应使用Task.Run

关于c# - 通过ASP.NET Web API有效地使用异步/等待,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31185072/

10-12 00:28
查看更多