Почему возвращение Task.CompletedTask не удалось скомпилировать в asyn c методе? - PullRequest
0 голосов
/ 05 марта 2020

Я использую VS2019 и dotnetcore 3.1 для простого консольного приложения, у меня есть этот фрагмент кода:

public static async Task F()
{
    await Task.Delay(1000);
    return Task.CompletedTask; // error
}

Он не компилируется. Я просто с помощью, чтобы создать метод, который (1) asyn c, и (2) возвращает задачу. Почему это выражение возврата не компилируется? Как это исправить, чтобы выполнить мои требования (1) и (2)?

Большое спасибо.

Ответы [ 3 ]

4 голосов
/ 05 марта 2020

Ваш метод может быть функционально сведен к этому.

public static Task F() 
{ 
  return Task.Delay(1000); 
}

Возврат экземпляра Task.CompletedTask полезен только в том случае, если применимы:

  • , который вы не хотите использовать async/await
  • ваш метод возвращает задание (фактически void, если вы сделаете его не асинхронным)
  • ваш код имеет лог c, где задача не может быть возвращена

Пример:

public static Task F() 
{ 
  if (someConditionToShortCircutTheMethod) 
      return Task.CompletedTask;

  // rest of logic
  return Task.Delay(1000); 
}

Как только вы сделаете свой метод async, факт, что Задача действительно возвращается, абстрагируется. Это может облегчить работу с кодом, особенно если есть несколько точек, в которых код ожидает завершения операций ввода-вывода.

public static async Task F() 
{ 
  if (someConditionToShortCircutTheMethod) 
      return;

  // rest of logic
  await Task.Delay(1000); 
  await Task.Delay(1000);
  // no return necessary, async Task has a similar flow as return type void
}

Я также рекомендую рассмотреть следующие предыдущие вопросы:

3 голосов
/ 05 марта 2020

await Task.Delay(1000); метод уже создает и возвращает Task, поэтому вы можете написать

public static async Task F()
{
    await Task.Delay(1000);
}

или использовать await с Task.CompletedTask;

public static async Task F()
{
    await Task.Delay(1000);
    await Task.CompletedTask;
}

В противном случае вам следует обновите тип возвращаемого значения до Task<Task>, что не имеет большого смысла

public static async Task<Task> F()
{
    await Task.Delay(1000);
    return Task.CompletedTask;
}
1 голос
/ 06 марта 2020

Не компилируется. Я только с, чтобы создать метод, который (1) asyn c, и (2) возвращает задачу. Почему это выражение возврата не компилируется? Как исправить это, чтобы выполнить мои требования (1) и (2)?

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

public static async Task F()
{
  await Task.Delay(1000);
  return;
}

или эквивалентно:

public static async Task F()
{
  await Task.Delay(1000);
}
...