Re: async-await вместе с Task.Run
От: SuhanovSergey  
Дата: 24.04.16 18:17
Оценка: 47 (2) +1
Здравствуйте, another_coder, Вы писали:

_>Поясните, пожалуйста, такую вещь? Иногда встречаю код, типа:

_>
_>Task t = Task.Run(async () => { await Task.Delay(2000); });
_>

_>Вот этот код делает тоже самое и выглядит проще:
_>
_>Task t2 = Task.Run(() => { Thread.Sleep(2000); });
_>

_>В каком случае первый вариант может быть полезен?

Как отметил Sinix, правильнее и проще всего вызвать просто t = Task.Delay(2000).

Может возникнуть вопрос, зачем вообще нужна форма Task.Run(async () => { await f(); }) если можно просто просто f(). Для f = Task.Delay — нет разницы. В общем же случае, разница в том, что в первом варианте f() вызываентся в тредпульном контексте, а не в текущем. Это может иметь значение, если текущий контекст, скажем — UI-ный, и мы хотим, чтобы асинхронные заверщения, что f() может произвести в процессе своей работы, были выполнены в тредпуле, а не в UI-ном потоке.

Возможно, код Task.Run(async () => { await Task.Delay(2000); }), что вы видите, остался после рефакторинга, когда внутри было что-то большее, чем Task.Delay.
Re: async-await вместе с Task.Run
От: Sinix  
Дата: 23.04.16 16:00
Оценка: +2
Здравствуйте, another_coder, Вы писали:

_>В каком случае первый вариант может быть полезен?

Оба неправильные.
Task t = Task.Delay(2000);


P.S. Первый получше, т.к. не блокирует поток из пула (пул конечно резиновый, но не настолько чтоб разбрасываться "лишним" потоком).
Отредактировано 23.04.2016 16:01 Sinix . Предыдущая версия .
async-await вместе с Task.Run
От: another_coder Россия  
Дата: 23.04.16 15:56
Оценка:
Поясните, пожалуйста, такую вещь? Иногда встречаю код, типа:
Task t = Task.Run(async () => { await Task.Delay(2000); });

Вот этот код делает тоже самое и выглядит проще:
Task t2 = Task.Run(() => { Thread.Sleep(2000); });

В каком случае первый вариант может быть полезен?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.