【问题标题】:Async method that does not make async calls不进行异步调用的异步方法
【发布时间】:2014-12-07 07:37:21
【问题描述】:

我需要创建一个方法来连接到我的 Azure SQL 数据库并读取一些数据。调用此方法的所有方法都是异步方法,但我认为我无法将 ReadStateProvinceListAsync 设为 async 一个。

在这些情况下,正确的方法是什么?只需忽略编译器的“警告”,即我有一个不使用 await 关键字的 async 方法 使 ReadStateProvinceListAsync 方法成为常规同步方法,在这种情况下 @987654326 @ 方法会给我同样的警告。

我想把它做好——按照书本。这就是为什么我想学习正确的方法。

public static async Task<List<StateProvince>> GetStateProvinceListAsync(string countryId)
{
   // Check to see if I already have this data cached
   if(gotData)
   {
      // Life is good! Get data from cache.
   }
   else
   {
      // Don't have the data cached. Call the DB read method
      statesList = await ReadStateProvinceListAsync(countryId)
   }
}

private static async Task<List<StateProvince>> ReadStateProvinceListAsync(string countryId)
{
   // Call Azure SQL Database to read data. No async code here!
}

【问题讨论】:

  • 你想要什么行为?如果您没有 await 任何东西,为什么首先要使用方法 async?毕竟,这就是创建方法async: 以允许await 的原因。如果ReadStateProvinceListAsync() 中没有异步实现,则不要将其命名为async(并从名称中删除Async
  • 返回等待Task.Run(Func...)

标签: c# .net asp.net-mvc asynchronous async-await


【解决方案1】:

async 关键字标记同步方法绝对没有任何价值。如果您的方法没有进行任何异步调用,请使其同步:

public static List<StateProvince> GetStateProvinceListAsync(string countryId)
{
   // Check to see if I already have this data cached
   if(gotData)
   {
      // Life is good! Get data from cache.
   }
   else
   {
      // Don't have the data cached. Call the DB read method
      statesList = ReadStateProvinceList(countryId)
   }
}

private static List<StateProvince> ReadStateProvinceList(string countryId)
{
   // Call Azure SQL Database to read data. No async code here!
}

如果出于某种原因您必须返回一个任务(例如,它是一个接口或抽象实现),请使用Task.FromResult 同步返回一个Task

private static Task<List<StateProvince>> ReadStateProvinceListAsync(string countryId)
{
    return Task.FromResult(ReadStateProvinceList());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多