2

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

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

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

D .Stark
  • 1,092
  • https://ru.stackoverflow.com/q/1250881/373567 – aepot Sep 19 '22 at 16:46
  • Основное правило этого сайта (за счёт чего он и взлетел): одна тема - один вопрос. Про ConfigureAwait и блокировки задайте отдельные вопросы. – Alexander Petrov Sep 19 '22 at 16:47
  • Этот вопрос в данный момент включает несколько вопросов. Его следует переформулировать, чтобы он был сфокусирован только на одной проблеме. – aepot Sep 19 '22 at 16:48
  • 1
  • @aepot Это не отвечает на 2 и 4 вопросы. На первый вопрос можно ответить следующим образом: делать метод асинхронным имеет смысл лишь в том случае, когда он зависит от кода, выполнение которого не зависит от нас. Следовательно и на третий вопрос можно ответить утвердительно, ведь метод Process в таком случае зависит от выполнения кода на стороне клиента. – D .Stark Sep 19 '22 at 20:55
  • 1
    @tym32167 aepot дал ссылку на подобный ответ. На вопросы 2 и 4 это так же не отвечает. – D .Stark Sep 19 '22 at 21:03
  • Касаемо второго вопроса - могу дать конкретный пример. Все вызовы асинхронного метода Process, обрабатывающего соединения, будут выполняться в одном потоке (при условии что до начала цикла приёма входящих соединений существовал 1 поток), ведь задача запускается с параметрами по-умолчанию, то есть созданные задачи не будут порождать новые потоки. Это верно? – D .Stark Sep 19 '22 at 21:18
  • Вам написали же, что лучше задавать вопросы отдельно. Мало смысла отвечать на 4 вопроса, а баллов получать как за один. – tym32167 Sep 19 '22 at 21:55
  • Я могу оформить отдельный вопрос про ConfigureAwait. Уже оформил отдельный вопрос про блокировки, но оставшиеся 3 вопроса относятся к одной проблеме, разве нет? – D .Stark Sep 19 '22 at 22:07
  • "Мало смысла отвечать на 4 вопроса, а баллов получать как за один." - Интересный подход – D .Stark Sep 19 '22 at 22:08
  • Ваши вопросы разные, так как: 1) Вы упускаете само понятие асинхронного метода. Асинхронный метод - это по сути синтаксический сахар. 2) Наличие await в асинхронном методе не обязано вообще быть связано с каким либо потоком 3) Как следствие, второй вопрос не имеет смысла, так как созданная задача вообще не обязана выполняться в каком либо потоке 4) Третий вопрос вообще не про асинхронщину, а про верную имплементацию серверной стороны используя асинхронщину, что по сути сомостоятельный вопрос сам по себе. – tym32167 Sep 19 '22 at 23:13
  • ну а про набор баллов, практика показала, что люди только на таком примере понимают. Если бы я рассказывал про базу вопросов / ответов или идею сайта, то большиство это пропускает мимо ушей – tym32167 Sep 19 '22 at 23:18
  • @tym32167 Разве поиск по сайту выдал бы разные результаты будь эти вопросы оформлены в одной теме или в разных? По своей тематике они всё же схожи. – D .Stark Sep 19 '22 at 23:53
  • https://ru.stackoverflow.com/questions/1450195/%d0%98%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b0%d1%81%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%b2-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d0%bc-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80%d0%bd%d0%be%d0%bc-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b8 – D .Stark Sep 19 '22 at 23:53
  • https://ru.stackoverflow.com/questions/1450198/configureawait-%d0%b8-%d0%ba%d0%be%d0%bd%d1%82%d0%b5%d0%ba%d1%81%d1%82-%d1%81%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8 – D .Stark Sep 20 '22 at 00:33
  • 1
    причем здесь поиск по сайту? Вот вы бы стали хранить инфу обо всех поставщиках макарон в одной строке БД? Наверное нет. Так и здесь, 1 вопрос на сайте - минимальная неделимая чать информации. Если задаете 2 вопроса - задаёте двумя вопросами на сайте. – tym32167 Sep 20 '22 at 02:54

1 Answers1

1

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

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

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

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

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

aepot
  • 49,560
  • "Возможно. За это отвечает контекст синхронизации, можете его полностью написать сами." - Кроме как создать свой контекст синхронизации существуют решения? – D .Stark Sep 20 '22 at 09:09
  • "По поводу потоков из пула, их там много" - Если существуют один поток и он запускает множество раз один и тот же асинхронный метод в цикле, до первого await'а все задачи будут выполняться синхронно (если мы не переопределим контекст синхронизации)? – D .Stark Sep 20 '22 at 09:13
  • @rock8 1) для async/await - нет 2) неважно сколько задач запускается, сам процесс запуска вообще может быть синхронным, например просто добавление этих задач в коллекцию, а потом ожидание всех сразу в комбинаторе типа Task.WhenAll, а вот продолжение кода после await зависит от текущего контекста, и если его нет, оно будет выполнена на потоке из пула. Синхронных пулов не бывает, однопоточные бывают, я показывал. Прекратите путать асинхронность и многопоточность. Это 2 совершенно несвязанные между собой вещи. Об этом тоже было многократно написано в ответах по ссылкам, перечитайте внимательно. – aepot Sep 20 '22 at 10:08
  • Проблема в том, что до начала асинхронной операции в рассматриваемом методе может выполняться большое количество вычислений, которые не плохо было бы распараллелить. То есть такой асинхронный метод должен начать выполнение в отдельном потоке, а когда начнется сама асинхронная операция - уже не важно что и где, планировщик сам решит как будет лучше. При этом выполняются и другие асинхронные методы. – D .Stark Sep 20 '22 at 11:11
  • @rock8 Читать https://learn.microsoft.com/ru-ru/dotnet/csharp/async, обратить внимание на разницу в подходе к CPU-bound задачам и IO-bound, если непонятно, о чем я, переключите язык статьи на английский, перевод там так себе. – aepot Sep 20 '22 at 11:19