Поставьте несколько HTTP-запросов для ожидания одного и того же порта завершения ввода-вывода - PullRequest
2 голосов
/ 28 ноября 2011

Мое приложение асинхронно загружает большой объем информации из веб-службы и "Application_Start".

Если запрос пользователя хочет использовать эту информацию, и он не готов, поток будет заблокирован с помощьюMonitor.Wait.Когда информация будет готова, объект кэша будет Monitor.Pulse всех ожидающих потоков.Это должно быть хорошо, так как информация занимает десяток секунд, и пользователь должен быть перенаправлен на страницу входа в систему, опубликовать информацию для входа и быть перенаправлен снова.

Проблема в том, что Monitor.Wait будетзаблокировать поток CLR ThreadPool, и, насколько мне известно, при поступлении пакета запросов, запрашивающих «большую информацию», приложение может остаться заблокированным из-за голодания CLR ThreadPool (у меня небольшой беспорядок с текущим потоком IIS / ASP.NETgating).

Поскольку большая часть информации поступает от веб-службы, которую я вызываю асинхронно, у меня есть IAsyncResult этой операции.

Итак, есть ли способ сообщить потоку CLR ThreadPool «Ожидание этого IOCP», чтобы поток пула потоков мог начать посещать другой вызов?

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

С уважением.

PS: Хотя щедрость закончена, если кто-нибудь знает способ сделать это, я поднимуновый и предоставьте автору.

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Это отличный вопрос. По моему опыту, чем больше вы пытаетесь вмешиваться во внутренние органы ASP.NET, тем больше боли вы причиняете.

Рассматривали ли вы использование serviceAutoStartProviders для поддержания вашего приложения горячим?

ASP.NET 4.0: как использовать класс разминки приложения

0 голосов
/ 05 декабря 2011

Вы должны использовать IHttpAsyncHandler, чтобы вернуть ваши медленно загружаемые большие данные. Пошаговое руководство. Создание асинхронного обработчика HTTP

Во время обработки асинхронного обработчика HTTP ASP.NET помещает поток, который обычно используется для внешнего процесса, обратно впул потоков, пока обработчик не получит обратный вызов от внешнего процесса .Это может предотвратить блокировку потоков и повысить производительность, поскольку одновременно может выполняться только ограниченное число потоков.

У вас не должно возникнуть проблем, если для возврата из IHttpAsyncHandler потребуется 12 секунд.На самом деле, вы должны быть в состоянии легко пройти до 60 секунд, не беспокоясь.Помимо этого вам может потребоваться реализовать какой-либо тип системы long-polling для мониторинга состояния системы.

IHttpAsyncHandler может возвращать XML / JSON или что угодно.Вы можете использовать IHttpAsyncHandler через ajax в javascript (может быть jQuery.ajax ) или даже на стороне сервера, если вы хотите использовать HttpWebRequest (пример кода C #: Вызов удаленного веб-сервиса JSON ).

...