PROBLEMA: Erro de System.InvalidOperationException ao usar HttpWebRequest e classes de HttpWebResponse no aplicativo com o pool de threads

Traduções deste artigo Traduções deste artigo
ID do artigo: 815637 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Expandir tudo | Recolher tudo

Sintomas

Quando você usa o System.NET.HttpWebRequest e as classes System.Net.HttpWebResponse em um aplicativo que usa um pool de segmentos, você receberá a seguinte mensagem de erro:
System.InvalidOperationException: não eram segmentos livres suficientes no objeto ThreadPool para concluir a operação

Causa

System.NET.HttpWebRequest e System.Net.HttpWebResponse classes sempre usam métodos assíncronos para concluir uma solicitação. Quando é feita a solicitação assíncrona, o ASP.NET usa um novo thread do objeto ThreadPool . Quando ASP.NET não encontrar um segmento, a classe System.NET.HttpWebRequest retorna a mensagem de erro em vez de enfileirar a solicitação.

Como Contornar

Para contornar este problema, use um dos seguintes métodos:
  • Use um bloco try-catch no código para capturar a exceção e manipulá-lo adequadamente.
  • Implemente um mecanismo de enfileiramento de mensagens para manter a exceção ocorra.
  • Se você estiver usando o ASP.NET no Microsoft Internet Information Services 5.0 ou posterior, reconfigure o tamanho de pool de thread no Machine.config arquivo. Para fazer isso, execute as seguintes etapas:
    1. Abra o arquivo Machine.config da pasta %Systemroot% \Microsoft.NET\Framework\ Version \Config.
    2. Na seção <processmodel> do ficheiro Machine.config, configure o valor da maxWorkerThreads e os atributos de maxIoThreads para o número máximo de segmentos de processo para cada CPU. Por exemplo, se esse valor for 25 em um servidor de processador único, o ASP.NET usa as interfaces (APIs) de programação de aplicativos tempo de execução para definir o limite do processo para 25. Em um servidor com dois processadores, o limite é definido para 50.

      Observação Monitore o uso da CPU quando você aumentar um pool de segmentos para manter os limites.
    3. Salve as alterações no arquivo Machine.config.

Situação

Esse comportamento é por design.

Mais Informações

  1. Iniciar Microsoft Visual Studio .NET.
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. Clique em Projetos do Visual Basic ou Visual translation from VPE for Csharp projetos em Tipos de projeto e, em seguida, clique em Aplicativo de console em modelos .
  4. Substitua o código na janela de código Class1 com o código a seguir, dependendo do tipo de projeto:

    código do .NET translation from VPE for Csharp Visual
    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();
    		}
    	}
    }
    
    Código do 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. No menu Debug , clique em Iniciar para executar o aplicativo. Após WorkerThreads disponível alcança 0, você receber a mensagem de erro listada na seção "Sintomas".

Referências

Para obter mais informações, visite os seguintes sites:
Programando o pool de threads no .NET Framework
http://msdn2.microsoft.com/en-us/library/ms973903.aspx

<processmodel> elemento
http://msdn2.microsoft.com/en-us/library/7w2sway1(vs.71).aspx

Propriedades

ID do artigo: 815637 - Última revisão: quinta-feira, 27 de fevereiro de 2014 - Revisão: 1.4
A informação contida neste artigo aplica-se a:
  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 1.1
Palavras-chave: 
kbnosurvey kbarchive kbmt kbnamespace kbweb kbxml kbwnet kberrmsg kbconfig kbdev kbthread kbprb KB815637 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 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