Задать вопрос
@returnZero

В чём отличие многопоточности и асинхронности в контексте .NET C#?

Добрый день.
Я не до конца понимаю в чём ключевое отличие асинхронности и многопоточности.
Как я понимаю многопоточность обеспечивается классом Thread(инкапсулированный поток ОС), а асинхронность - Task, Async, Await, ThreadPool. И мол вот, при использовании этих конструкций мы не блокируем вызывающий поток. Но ведь при классической многопоточности никакой поток так же не блокируется, мы просто его создаем, кормим ему задачу и всё - основной поток свободен. Тем более при асинхронности практически всегда подразумевается многопоточность - тот же ThreadPool который работает с тасками и запускает задачи в заранее заготовленных фоновых потоках. То же самое и с async/await. Можете пожалуйста помочь упорядочить всю эту информацию, заранее спасибо!
  • Вопрос задан
  • 4898 просмотров
Подписаться 3 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 2
Nipheris
@Nipheris Куратор тега C#
Асинхронность - это способ организации вычислений, когда код, вызывающий какую-либо операцию/подпрограмму /функцию, не дожидается завершения работы этой операции, а если ему интересен результат вычислений, то он получает вместо готового результата некий способ запросить результат позже, когда он будет готов (то, что называется промисом или фьючером или ещё как-то в зависимости от языка). Это по сути противоположность "обычному" синхронному вызову, когда вызывающий код останавливается и ждёт завершения функции, чтобы получить результат. Как это будет достигнуто - это уже другой вопрос, это зависит от сути операции, запускаемой асинхронно.

Но ведь при классической многопоточности никакой поток так же не блокируется

Что такое "классическая многопоточность"? Что это за термин? Что такое неклассическая многопоточность?
Если брать потоки ОС, то операционка просто передаёт управление созданному потоку в желаемую точку входа и дальше уже поток решает что и как делать. Поток может молотить вычисления 10 минут, потом записать их куда-нибудь в файл и завершиться. Никаких кормлений задачами не будет (хотя я не совсем понимаю что такое кормить задачами в вашем контексте).

Тем более при асинхронности практически всегда подразумевается многопоточность

С чего бы? Асинхронный код полезен при большом количестве операций ввода-вывода - диск, сеть и т.д. Не обязательно это должно быть что-то, вычисляющееся в отдельном потоке. Вот, почитайте хорошую статью: There is no thread.

Вам будет полезно ознакомиться с асинхронностью в какой-нибудь изначально однопоточной среде, например JS в браузере не считая вебворкеров. Тогда вы поймёте разницу.
Ответ написан
@none7
Разница в том, что многопоточность это вытесняющая многозадачность, а async это кооперативная. А блокируймость и неблокируймость это из религии JS пришло, где потоков нет вообще. У обоих подходов есть как свои плюсы, так и свои минусы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы