Для продолжительной работы, если поток asp.net освобождается до других запросов сервера. На каком потоке будет выполняться долго работающая операция и как она будет получать поток asp.net после его завершения.Обработка потоков в ASP.NET Async Ожидание операций
ответ
Как я описываю в своем блоге long-running I/O operations do not require a thread at all. Скорее, они используют естественно-асинхронный ввод-вывод, который не требует потока.
Драйверы устройств обычно используют DMA, что позволяет устройству напрямую считывать/записывать из основной ОЗУ системы. .NET дополняет этот подход с помощью IOCP (порт завершения ввода-вывода), который является частью пула потоков, позволяя одному потоку (или очень немногим потокам) на однодоменное ожидание на огромном количестве операций ввода-вывода.
Для ответа на вторую половину вашего вопроса, асинхронный метод будет резюме с контекстом запроса, но может или не может быть на том же потоке, он был на перед await
. Более распространенный сценарий - когда операция ввода-вывода завершается, он сигнализирует IOCP, который принимает поток пула потоков, чтобы выполнить немного домашнего хозяйства (маркировка задачи как завершена и т. Д.), А затем тот же поток входит в ASP.NET запрашивать контекст и возобновлять выполнение обработчика. Это не всегда Бывают - иногда нужен переключатель потоков, но это самый распространенный случай.
Чтобы ответить на ваш вопрос, все темы взяты из пула потоков.
Пример сценария может быть задан таким образом, когда запрос получен сервером, доступный поток извлекается из пула для обслуживания запроса.
Затем вы создаете новую нить (либо Async
, либо другие средства). Теперь из пула извлекается новый поток, чтобы выполнить запрос вашего тела Async
.
Между тем исходная нить освобождается в пул и возвращается к обработке другого запроса.
Когда ваша потоковая обработка закончена, она возвращает другой поток (может не совпадать с исходным потоком) из пула и завершает ваш запрос.
Это полная трата времени, если этот процесс связан с ЦП, поскольку вы блокируете один поток (который из одного пула). Однако операции с привязкой IO можно обрабатывать так, так как они не используют нити.
- 1. Ожидание нескольких операций async в Nightwatch.js
- 2. RxJS: ожидание завершения списка операций async
- 3. Ожидание операций сокета
- 4. Разница между TPL и async/await (Обработка потоков)
- 5. Ожидание потоков в java
- 6. Dropwizard loglog async log rotation, вызывающий ожидание потоков приложений
- 7. Обработка запроса Async в ASP.NET MVC
- 8. Ожидание/Async или SocketAsyncEventArgs?
- 9. Понимание async и ожидание
- 10. Ожидание async TaskEx
- 11. Angular2 Обещания Async/ОЖИДАНИЕ
- 12. Async/Ожидание не ждет
- 13. Задание async и ожидание
- 14. async/ожидание и многопроцессорность
- 15. Ожидание завершения операции async
- 16. Ожидание завершения потоков
- 17. Ожидание звонков Async
- 18. C# async ожидание реализации
- 19. Async/ожидание в пределах BeginReceive Обратный звонок
- 20. Akka - Обработка операций блокировки
- 21. Ожидание выполнения всех задач в Async
- 22. async/ожидание и открытие FileStream?
- 23. Обработка async в python
- 24. Правильное использование async и ожидание
- 25. Ожидание выполнения предыдущей функции async
- 26. Ожидание до завершения задачи async
- 27. Есть ли ожидание для потоков?
- 28. Рефакторинг Async/Ожидание параллельной обработки
- 29. Ошибка задачи Async (Ожидание результата)
- 30. Обработка потоков в C#
Спасибо, Стивен Клири! – Sunny
Что делать, если это не операция ввода-вывода. Если это бизнес-логика, которая выполняется внутри функции и потребляет столько времени. Разве это не создало бы новый поток. – Sunny
@Sunny: Нет. Если вы используете 'async' без' await', тогда код запускается непосредственно в вызывающем потоке. Если вы используете 'await Task.Run', то' Task.Run' (* not * the 'async' /' await') использует отдельный поток пула потоков (обратите внимание: это не рекомендуется на ASP.NET). –