6

В чем разница если по сути можно отправить в Task.Run(SomeMethod) метод и не писать

async void AsyncMethod()
{

await Task.Run(SomeMethod);

}

public void SomeMethod(){}

n_enrai49
  • 453

1 Answers1

4

Task.Run() запускает код в потоке, то есть это почти то же самое, что создание и запуск потока Thread.Start() с одной разницей, Task.Run() по умолчанию берет поток из пула, а Thread.Start() создает новый поток.

async и await это система ожидания асинхронных задач, и к многопоточному программированию имеет не прямое отношение.

Task.Run() или Thread.Start() стоит использовать при длительной нагрузке на процессор, например в сложных вычислениях (CPU-bound задач), чтобы распределить нагрузку на несколько ядер процессора. async и await следует использовать для обычного запроса на сервер, работы с файлами, базами данных и других операций ввода-вывода (IO-bound задач).

Подробнее можно почитать в документации: Асинхронное программирование.

aepot
  • 49,560
  • а в какое преимущества у async/await? – n_enrai49 Apr 21 '22 at 20:22
  • 2
    @n_enrai49, в производительности, так как создание потока требует выделение памяти и работу сборщика мусора. А в одном async методе может быть несколько await, что гораздо выгоднее. – Olegator36 Apr 21 '22 at 20:34
  • то есть множество задач лучше запускать через async/await, а не через пропись Task.Run() нескольких раз? – n_enrai49 Apr 21 '22 at 20:38
  • @n_enrai49, да. – Olegator36 Apr 21 '22 at 20:39
  • 1
    Множество коротких по времени выполнения - да. множество тяжелых(несколько тысяч и более) - на своей реализации очереди потоков, много потоков - плохо. Тяжелые задачи в async await - плохо. – Владимир Клыков Apr 21 '22 at 20:40
  • 5
    немножечко поправлю текст. 1) Таск представляет собой операцию, а не поток. 2) Task.Run() обычно шлет задачу в пул потоков, Thread.Start() создает новый поток. Луше использовать пул потоков. 3) async await не снижают никакую производительность, это вообще не про производительность 4) множество задач лучше запускать через async/await - async/await не запускает задачи вообще, это способ дождаться выполнения операции 5) Совсем не покрыта тема асинхронных операций, по сути причину, зачем async/await вообще добавили – tym32167 Apr 21 '22 at 21:39
  • 1
    Task является реализацией потока не является, это ошибочное суждение. – aepot Apr 21 '22 at 23:14
  • Удивлён, как ещё минусов не понаставили. Особенно за бред про замедление в 10 раз от использования асинхронности. Нет, можно, наверное, придумать пример, в котором так будет, но это будет очень искусственный пример, не из реальной жизни. – CrazyElf Apr 22 '22 at 06:09
  • 2
    @CrazyElf я надеюсь, автор займется улучшением ответа на основе комментариев и поглубже изучит матчасть. Минусить принятый ответ - последнее дело. – aepot Apr 22 '22 at 06:25
  • @aepot Будем надеяться, да. Так то я лично минусю только за явное неуважение к сообществу, а за неверный ответ просто не ставлю плюс. Но я видел тут, что за некорректные ответы могут и заминусить. – CrazyElf Apr 22 '22 at 06:49
  • @CrazyElf ну, строго говоря, асинхронность добавляет переключение контекста, потому одна выбранная задача асинхронно может отработать медленней, чем синхронно. Для одной задачи так часто и бывает. Но просто асинхронность никогда и не предназначалась для ускорения одной задачи. Асинхронность вообще не про ускорение. – tym32167 Apr 22 '22 at 10:23
  • @tym32167 Так и многопоточность добавляет переключение контекста, теоретически тоже можно придумать случаи (и они реально бывают), когда многопоточность замедляет работу. Но сходу говорить про 10-кратное снижение производительности из-за async/await - это как-то как-то ) – CrazyElf Apr 22 '22 at 10:32
  • @CrazyElf так далеко ходить не надо, я в одном из дубликатов даже пример приводил, когда многопоточка добавляет. Я потому и писал выше про одну задачу В одном потоке. К тому же я не спорю, просто попытался пояснить, что человек мог иметь ввиду про производительность. – tym32167 Apr 22 '22 at 11:39
  • Отредактировал ответ, так как автор решил видимо этого не делать или просто еще не успел. – aepot Apr 22 '22 at 17:37
  • Присоединюсь к комментаторам - давно, когда изучал многопоточность и асинхронность, очень сильно помогла лекция https://www.youtube.com/watch?v=mtTZu8CXaGE&t. Конечно, в ней есть некоторые неточные моменты, но в целом она должна помочь автору разобраться в этой теме – Frehzy Apr 23 '22 at 13:29