通过 ASP.NET Web API 有效使用 async/await

2024-03-18

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

工作流程:

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

控制器:

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。请分享您的想法。


我不太确定它是否会对我的 API 性能产生任何影响。

请记住,服务器端异步代码的主要好处是可扩展性。它不会神奇地使您的请求运行得更快。我涵盖了几个“我应该使用async“我的考虑文章关于async ASP.NET https://msdn.microsoft.com/en-us/magazine/dn802603.aspx.

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

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

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");
}

请注意,从“由内而外”开始工作比“由外而内”进行工作更容易。换句话说,不要从异步控制器操作开始,然后强制下游方法异步。相反,识别自然异步操作(调用外部 API、数据库查询等),并在lowest第一级(Service.ProcessAsync)。然后让async滴流向上,最后一步使控制器操作异步。

在任何情况下你都不应该使用Task.Run在这种情况下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 ASP.NET Web API 有效使用 async/await 的相关文章

随机推荐