Ожидать с и без назначения задачи - PullRequest
0 голосов
/ 04 декабря 2018

Рассмотрим небольшую функцию:

private async Task LittleFunction()
{
  var operand = new SomeObject();
  var notUsedResult =  await SomeAsyncOperationWith(operand); // 1
  // OR
  await SomeAsyncOperationWith(operand); // 2
  SomeOtherOperationsWith(operand); 
}

Есть ли разница между 1 и 2 ?Я знаю о контексте и других свойствах задач, которые могу использовать, но теперь меня интересуют различия в поведении конечных автоматов.Благодарю.

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Реализация из SomeAsyncOperationWith(operand); отвечает за создание Task, планирование любой работы, которая не может быть немедленно завершена для выполнения в подходящее время, и решение, когда пометить Task, которую она возвращает какЗавершено, отменено или неисправно.

Он не знает и не заботится о том, что любой вызывающий метод делает с возвращенным Task, или Result, который Task в конечном итоге содержит.

Ничто в "конечном автомате" (если оно вообще существует) не предоставляется вызывающей стороне.

0 голосов
/ 04 декабря 2018

Нет никакой разницы между этими двумя;хотя, если вам не требуется присваивание, по моему мнению, лучше его пропустить для улучшения читабельности (т. е. если методы работают быстрее, чем в простых примерах выше, не вводя новую переменную, тогда никто не должен мысленно отслеживатьnotUsedResult (хотя ваше именование в любом случае хорошо с этим справляется).

// 1
private async Task LittleFunction()
{
  var operand = new SomeObject();
  var notUsedResult =  await SomeAsyncOperationWith(operand); 
  SomeOtherOperationsWith(operand); 
}

// 2
private async Task LittleFunction()
{
  var operand = new SomeObject();
  await SomeAsyncOperationWith(operand); 
  SomeOtherOperationsWith(operand); 
}

Однако существует третий вариант:

// 3
private async Task LittleFunction()
{
  var operand = new SomeObject();
  var task = SomeAsyncOperationWith(operand); 
  SomeOtherOperationsWith(operand); 
  await task;
}

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

0 голосов
/ 04 декабря 2018

Нет заметной разницы в этих 2 методах, и если что-нибудь приведет к одному и тому же IL, тем не менее, вы можете доказать это сами с помощью дизассемблера .net.

Я думаю, что более интересный моментэтот вопрос

, но теперь меня интересуют различия в поведении конечных автоматов.

Принцип работы конечного автомата является подробностью реализации и, вероятно, изменится с версии наверсия (и сильно изменилась с тех пор, как async был впервые реализован).

Что вас должно беспокоить, так это ваша среда, если у вас есть проблемы с производительностью, вы должны использовать профилировщик или инфраструктуру тестирования, а не вторуюугадать внутренности CLR и Jitter

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