Entrar

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

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.

815637
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
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.IOImports System.NetImports System.TextImports System.ThreadingImports System.Net.SocketsModule 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 SubEnd 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:
Try... catch

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 815637 - Última Revisão: 02/27/2014 05:24:59 - Revisão: 1.4

  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 1.1
  • kbnosurvey kbarchive kbmt kbnamespace kbweb kbxml kbwnet kberrmsg kbconfig kbdev kbthread kbprb KB815637 KbMtpt
Comentários