Асинхронное программирование и задачи в C#

У меня есть несколько теоретических вопросов по использованию задач, которые я бы хотел разъяснить для себя.

В чём смысл использования асинхронных методов? Правильный асинхронный метод использует внутри себя один или несколько операторов await, которые позволяют дождаться завершения операции не блокируя текущий поток. Как только такой оператор встречается, соответствующая операция запускается асинхронно, а поток, в котором выполнялся метод возвращается в пул потоков. После этого он может приступить к выполнению другой задачи, которая находится в локальной очереди этого потока, а продолжение исходного метода может быть выполнено вообще в любом другом свободном потоке. В чём смысл выполнять асинхронную операцию в другом потоке? Операция в любом случае должна быть выполнена, почему бы исходному потоку не сделать этого? В случае await Task.Delay преимущество на лицо: чтобы поток не простаивал без дела, он может заняться выполнением другой задачи, а потом, например, вернуться к выполнению исходного метода. К какого типа операциям в итоге приводят все await (внутри каждого асинхронного метода есть оператор await, который асинхронно ожидает другой асинхронный метод, который так же содержит оператор(ы) await и так далее), что поток блокируется?

Почему не возможно задать асинхронному методу параметры создания задачи? Может быть мне важно, чтобы задача, созданная в результате вызова асинхронного метода, выполнялась сразу в отдельном потоке, а не ожидала пока какой-нибудь поток из пула освободится?


Ответы (1 шт):

Автор решения: aepot

В чём смысл использования асинхронных методов?

В чем смысл всего асинхронного программирования? В умении ожидать завершения задач не переставая делать что-то еще.

Почему не возможно задать асинхронному методу параметры создания задачи?

Возможно. За это отвечает контекст синхронизации, можете его полностью написать сами.

По поводу потоков из пула, их там много, и если повесить все сотни тысяч потоков забив весь пул - недостаточно, то что-то у вас в коде пошло явно не так. Опять же асинхронная операция может не занимать потоков на время выполнения вообще ни одного, в большинстве классических случаев ожидания ответа от диска или из сети так и происходит.

→ Ссылка