PRB: Ошибка System.InvalidOperationException при использовании HttpWebRequest HttpWebResponse классов в приложении с помощью пула потоков

Переводы статьи Переводы статьи
Код статьи: 815637 - Vizualiza?i produsele pentru care se aplic? acest articol.
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Развернуть все | Свернуть все

Проблема

При использовании командыSystem.Net.HttpWebRequestиSystem.Net.HttpWebResponseклассы в приложения, использующего пул потоков, может появиться следующее сообщение об ошибке:
System.InvalidOperationException: Существует не были недостаточно свободных потоков в ThreadPool объекта для выполнения этой операции

Причина

надписьюSystem.Net.HttpWebRequestиSystem.Net.HttpWebResponseклассы всегда использовать асинхронные методы для выполнения запроса. Когда выполняется асинхронный запрос, ASP.NET использует новый поток изThreadPoolОбъект. Если ASP.NET не находит потокаSystem.Net.HttpWebRequestкласс возвращает сообщение об ошибке, вместо того, чтобы очередь запроса.

Временное решение

Для решения этой проблемы воспользуйтесь одним из описанных ниже способов.:
  • Используйте блок Try-Catch в коде для перехвата исключения и обрабатывает его соответствующим образом.
  • Реализация очереди механизм для поддержания возникновения исключения.
  • При использовании ASP.NET в службах IIS 5.0 или более поздней версии, изменить размер пула потоков в Machine.config файла. Выполните следующие действия::
    1. Откройте файл Machine.config в%systemroot%\Microsoft.NET\Framework\номер_версииПапка \CONFIG.
    2. В <processmodel>раздел файла Machine.config, настройте значение</processmodel>maxWorkerThreadsиmaxIoThreadsатрибуты, максимальное число потоков процесса для каждого Процессора. Например если это значение равно 25 на сервере с одним процессором, ASP.NET использует во время выполнения приложения, программные интерфейсы (API) установить ограничение процесса до 25. Для двухпроцессорного сервера этот предел установлено в значение 50.

      Примечание.Мониторинг загрузки центрального Процессора при увеличении пул потоков для обеспечения ограничения.
    3. Сохраните изменения в файле Machine.config..

Статус

Такое поведение является особенностью данного продукта..

Дополнительная информация

  1. Запустите Microsoft Visual Studio .NET..
  2. в менюФайл:Выберите пункт менюСОЗДАТЬ.и выберите командуProject.
  3. затем –Проекты Visual Basic-или-Проекты Visual C#Из спискаТипы проектови выберите командуКонсольного приложенияИз спискаШаблоны:.
  4. Замените код в окно кода для класса Class1 на следующий код в зависимости от типа проекта.

    Код .NET в Visual C#
    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Threading;
    using System.Net.Sockets;
    
    namespace threadTest
    {
      
    	class Class1
    	{
    		 public static void Main()
    		{			
    		// Set number of threads to be created for testing.
    			int testThreads = 55;
    			for(int i=0;i<testThreads;i++)
    			{
    				ThreadPool.QueueUserWorkItem(new WaitCallback(PoolFunc));
    			}
    			Console.ReadLine();
    		}
    
    		static void PoolFunc(object state)
    		{
    			int workerThreads,completionPortThreads;
    			ThreadPool.GetAvailableThreads(out workerThreads,
    				out completionPortThreads);
    			Console.WriteLine("WorkerThreads: {0}, CompletionPortThreads: {1}", 
    			workerThreads, completionPortThreads);
    			Thread.Sleep(10000);
    			
    			string url ="http://www.msn.com";         
    			
    			HttpWebRequest myHttpWebRequest ; 
    			HttpWebResponse myHttpWebResponse=null ;        
    			// Creates an HttpWebRequest for the specified URL.    
    			myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
    			// Sends the HttpWebRequest, and waits for a response.
    			myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();            
    			myHttpWebResponse.Close();
    		}
    	}
    }
    
    Код Visual Basic .NET
    Imports System.IO
    Imports System.Net
    Imports System.Text
    Imports System.Threading
    Imports System.Net.Sockets
    
    Module Module1
    
       Sub Main()
          'Set number of threads to be created for testing.
          Dim testThreads As Integer = 55
          Dim i As Integer
    
          For i = 0 To testThreads
             ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf PoolFunc))
          Next
          Console.ReadLine()
    
       End Sub
       Public Sub PoolFunc(ByVal state As Object)
    
          Dim workerThreads, completionPortThreads As Integer
    
          ThreadPool.GetAvailableThreads(workerThreads, completionPortThreads)
    
          Console.WriteLine("WorkerThreads: {0}, CompletionPortThreads: {1}", workerThreads, completionPortThreads)
          Thread.Sleep(10000)
          Dim url As String = "http://www.msn.com"
          Dim myHttpWebRequest As HttpWebRequest
          Dim myHttpWebResponse As HttpWebResponse = Nothing
          ' Creates an HttpWebRequest for the specified URL. 
          myHttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
          'Sends the HttpWebRequest, and waits for a response.
          myHttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse)
          myHttpWebResponse.Close()
       End Sub
    End Module
  5. в менюОтладкавыберите пунктSTART ::для запуска приложения. После доступных WorkerThreads достигает 0, появляется сообщение об ошибке, приведенное в разделе «Проблема».

Ссылки

Дополнительные сведения см. на перечисленных ниже страницах веб-сайта корпорации Майкрософт.:
Программирование пула потоков в .NET Framework
http://msdn2.Microsoft.com/en-us/library/ms973903.aspx

<processmodel>Элемент</processmodel>
.aspx HTTP://msdn2.Microsoft.com/en-us/library/7w2sway1 (vs.71)

Свойства

Код статьи: 815637 - Последний отзыв: 21 февраля 2014 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 1.1
Ключевые слова: 
kbnosurvey kbarchive kbnamespace kbweb kbxml kbwnet kberrmsg kbconfig kbdev kbthread kbprb kbmt KB815637 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:815637

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com