Ответ 1
Вот некоторые отличия:
- Вычисление может выполняться в другом потоке. Он может работать в одном потоке, если эта задача основана на процессорах и может быть встроена. Это не детерминировано.
- Если никакой инкрустации не произойдет, во время вычисления будет использоваться еще один поток. Обычно это стоит 1 МБ памяти стека.
- Исключения будут завернуты в
AggregateException
. Стек исключений будет другим. - Версия задачи может зайти в тупик, если вычисления отправляются в текущий контекст синхронизации.
- Если пул потоков максимален, это может привести к блокировке, если задача для выполнения другой задачи должна быть запланирована.
- Потоковое локальное состояние, такое как
HttpContext.Current
(которое фактически не является потоком, но почти), может отличаться. - Отключение потока основного потока не достигнет тела задачи (кроме случаев вложения). Я не уверен, будет ли само по себе ожидание или нет.
- Создание
Task
вызывает барьер памяти, который может иметь эффект синхронизации.
Есть ли это? Решите сами по этому списку.
Есть ли преимущества для этого? Я не могу думать ни о чем. Если в вашем вычислении используется async IO, ожидание отрицает преимущества, которые приносит асинхронный ввод-вывод. Единственным исключением будет разветвление IO, например. выдавая 10 HTTP-запросов параллельно и ожидая их. Таким образом, у вас есть 10 операций за счет одного потока.
Обратите внимание, что Wait
и Result
эквивалентны во всех этих отношениях.