Поясните, пожалуйста, такую вещь? Иногда встречаю код, типа:
Task t = Task.Run(async () => { await Task.Delay(2000); });
Вот этот код делает тоже самое и выглядит проще:
Task t2 = Task.Run(() => { Thread.Sleep(2000); });
В каком случае первый вариант может быть полезен?
Здравствуйте, another_coder, Вы писали:
_>В каком случае первый вариант может быть полезен?
Оба неправильные.
Task t = Task.Delay(2000);
P.S. Первый получше, т.к. не блокирует поток из пула (пул конечно резиновый, но не настолько чтоб разбрасываться "лишним" потоком).
Здравствуйте, 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.