Как удалить предупреждение StyleCop «В этом асинхронном методе отсутствуют операторы« ожидания »и он будет работать синхронно», не удаляя асинхронность из сигнатуры - PullRequest
0 голосов
/ 22 февраля 2019

Родительский объект и большинство детей имеют асинхронный режим и используют ожидание.StyleCop наблюдает и бросает вызов отсутствию ожидания в одном дочернем классе.

Каков наилучший способ сделать StyleCop счастливым, если вы не можете удалить асинхронную подпись?

Например:

class Program
{
  static void Main(string[] args)
  {
     var t = DownloadSomethingAsync();

     Console.WriteLine(t.Result);
  }

  public delegate Task<string> TheDelegate(string page);

  static async Task<string> DownloadSomethingAsync()
  {
     string page = "http://en.wikipedia.org/";

     var content = await GetPageContentAsync(page);

     return content;
  }

  static async Task<string> GetPageContentAsync(string page)
  {
     string result;

     TheDelegate getContent = GetNotOrgContentAsync;
     if (page.EndsWith(".org"))
     {
        getContent = GetOrgContentAsync;
     }

     result = await getContent(page);

     return result;
  }

  static async Task<string> GetOrgContentAsync(string page)
  {
     string result;

     using (HttpClient client = new HttpClient())
     using (HttpResponseMessage response = await client.GetAsync(page))
     using (HttpContent content = response.Content)
     {
        result = await content.ReadAsStringAsync();
     }

     return result;
  }

  static async Task<string> GetNotOrgContentAsync(string page)
  {
      return await Task.FromResult("Do not crawl these");
      // removing async will cause "Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task<string>'
  }

}

Нашел решение - создав его для поиска в Google, чтобы найти easilly.

Вы также можете использовать подавление предупреждений, как упомянуто здесь: Подавить предупреждение от пустого асинхронного метода

// редактировать, чтобы удалить дискуссию о ведении журнала, о которой вопрос не имел никакого отношения и был только для примера.

// изменить, чтобы принудительно потребовалась асинхронность, потому что это сбило с толку людей

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Если вы ничего не делаете await, просто удалите ключевое слово async из объявления метода и верните Task.CompletedTask:

public override Task DoMyThing()
{
    // ..
    return Task.CompletedTask; // or Task.FromResult(0); in pre .NET Framework 4.6
}

Поскольку виртуальный метод вбазовый класс помечен как async, но это не означает, что переопределение также должно быть помечено как async.Ключевое слово async не является частью сигнатуры метода.

0 голосов
/ 22 февраля 2019

Опции:

Добавить немного кода в вашу асинхронную функцию:

return await Task.FromResult("Do not crawl these");

Подавить по всему проекту:

#pragma warning disable 1998

Или подавить по одному методу:

#pragma warning disable 1998
async Task Foo() {}
#pragma warning restore 1998
...