Передача `Func <Task>` методу - есть ли различия между вызовом func против lambda против async / await lambda? - PullRequest
0 голосов
/ 29 мая 2018

Давайте рассмотрим методы:

public static void FireAsyncAndForget(Func<Task> func)
{
    JoinableTaskFactory.RunAsync(func).FileAndForget();
}

async Task DoAsync()
{
    await SomeOtherMethodAsync();
}

Есть ли какая-либо разница в том, как код выполняется между тремя примерами ниже?

  1. FireAsyncAndForget(DoAsync);
  2. FireAsyncAndForget(() => DoAsync());
  3. FireAsyncAndForget(async () => await DoAsync());

1 Ответ

0 голосов
/ 29 мая 2018

Если я не ошибаюсь, все три из них, по-видимому, будут выполняться одинаково, хотя есть небольшая разница.

Опция 1 будет выполнять DoAsync напрямую, в то время как два других вызывают функцию, которая сама вызывает DoAsync.,Это создаст дополнительную запись в вашем стеке.Та же логика применима к варианту 3 по сравнению с 2, есть дополнительный вызов await и поэтому (если компилятор не оптимизирует его), я ожидаю, что он сгенерирует дополнительное состояние.

Видя заметную разницу во времени выполнения между этимиВпрочем, я ожидал бы оказаться в сфере микрооптимизаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...