Я вижу из вашей дискуссии с dotnetstep вы пытаетесь собрать приложение MVC, но я не думаю, что мне нужно видеть, что для ответа на ваш вопрос. Ответ Dotnetstep верен, но я хотел бы уточнить некоторые дополнительные вопросы, которые вы сделали в своих комментариях.
Я хочу, чтобы понять, где что пул потоков 5 поступает из
То есть просто произвольное число dotnetstep выбрал. Это число будет поступать из раздела processModel> maxWorkerThreads файла web.config. Это число одновременно выполняемых запросов ASP.NET. Этот номер поощряет разработчиков к минимизации времени выполнения запросов. Например, если это число равно 5, то ASP.NET может обрабатывать 5 запросов одновременно. Но что будет, если запрос зависит от какой-либо другой операции ввода-вывода? Что делать, если вам нужно позвонить в веб-службу?
В сценарии «Синхронизация», когда «Request1» входит и вызывает веб-службу, поток Request1 будет ждать ответа от веб-службы. То же самое для Request2, Request3, Request4 и Request5. Когда Request6 приходит на сервер, он вернет ответ HTTP 503 («service unavailable»), поскольку все 5 потоков ждут ответа веб-службы. На этом этапе ваш сервер не может обрабатывать больше запросов до тех пор, пока один из запросов не будет завершен, и поток не будет возвращен в пул потоков.
В сценарии «Async» Request1 входит и вызывает веб-службу, поток Request1 НЕ будет ждать ответа от веб-службы, но сразу же вернется в пул потоков. То же самое для Request2, Request3, Request4 и Request5. Когда Request6 приходит, на сервере есть все 5 потоков (при условии, что ни один из вызовов веб-служб не вернулся) для обработки запроса. Это преимущество «Async», потому что оно не блокирует поток. Таким образом вы можете обрабатывать больше запросов одновременно.
Как вы можете ясно видеть это, все зависит от того, что вы делаете в запросе. Если запрос выполняет работу, которая требует чистого внимания к ЦП (интенсивная работа с ЦП), то async не поможет вам, так как это асинхронный или синхронизированный, процессор занят и больше ничего не может сделать. Поэтому ваш запрос будет ждать. Обратите внимание на то, что вы делаете в своей работе Async.Если все ваши дела для целей тестирования является:
Thread.Sleep(2000);
тогда ваш поток все еще хранится занят ли это синхронизация или асинхронный (есть только один способ нить может спать, он не может спать и делать работу в то же время путем возврата в пул потоков).
Сделайте то, что действительно асинхронно, например, прочитайте из большого файла, и вы увидите реальную выгоду или асинхронную синхронизацию.
и почему он отличается от пула потоков, который он выгружает.
Нить, которая выполняет запросы ввода-вывода, не те же потоки, которые обслуживают эти запросы ASP. В некоторых случаях это даже не тот же компьютер, например, если вы вызываете веб-службу, которая находится на другом компьютере или читается из файла, который находится на какой-либо другой машине ... вы понимаете суть.
Update 1:
Немного больше информации, которая может быть полезным, когда у вас есть такой код:
return new Task(() => Thread.Sleep(2000));
Если приведенный выше код обрабатывается ниткой Request1, он будет переложена другой поток (Request1, Request2, Request3 или Request4). И эта другая нить будет спать. Так что, по сути, это стоит вам больше, потому что вы переключили контексты, но вы ничего не получили взамен. Поэтому из-за переключения контекста ваша асинхронная версия будет медленнее, чем ваша версия синхронизации.
Кроме того, имейте в виду, что время ожидания клиента будет почти таким же, будь то синхронизация или асинхронность (это не будет сделано быстрее). Единственное преимущество заключается в том, что ваш сервер может обрабатывать больше запросов. Работа по-прежнему должна быть выполнена так или иначе (синхронизация или асинхронный режим).
Был ли мой вопрос непонятным? Мой ответ уже существует где-то еще? Или я просто рисую близкие и низкие голоса, потому что само упоминание о «асинхронной синхронизации» отвратительно для вас? – ricksmt
Что означает «асинхронная синхронизация»? – Enigmativity
Не могли бы вы поставить пример кода? – dotnetstep