Разместите несколько HTTP-запросов для ожидания одного и того же порта завершения ввода-вывода

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

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

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

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

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

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

С уважением.

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

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам