PROBLEMA: Erro de System.InvalidOperationException quando utiliza HttpWebRequest e classes de HttpWebResponse nas aplicações com o conjunto de threads

Traduções de Artigos Traduções de Artigos
Artigo: 815637 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Sintomas

Quando utiliza o System.Net.HttpWebRequest e as classes System.Net.HttpWebResponse numa aplicação que utiliza um conjunto de threads, poderá receber a seguinte mensagem de erro:
System.InvalidOperationException: Não existe não foram suficientes threads livres no objecto ThreadPool para concluir a operação

Causa

System.Net.HttpWebRequest e System.Net.HttpWebResponse classes sempre utilizar métodos assíncronos para concluir um pedido. Quando é efectuado o pedido assíncrono, o ASP.NET utiliza um novo thread do objecto ThreadPool . Quando o ASP.NET não encontrar um thread, a classe System.Net.HttpWebRequest devolve a mensagem de erro em vez de colocação em fila o pedido.

Como contornar

Para contornar este problema, utilize um dos seguintes métodos:
  • Utilize um bloco try-catch no código para chamar a excepção de e para processar correctamente.
  • Implemente um mecanismo de Colocação de mensagens em fila para manter a excepção ocorra.
  • Se estiver a utilizar o ASP.NET no Microsoft Internet Information Services 5.0 ou posterior, reconfigurar o tamanho de conjunto de thread na Machine.config ficheiro. Para o fazer, siga estes passos:
    1. Abra o ficheiro Machine.config da pasta %Systemroot% \Microsoft.NET\Framework\ Version \Config.
    2. Na secção <processmodel> do ficheiro Machine.config, configurar o valor do maxWorkerThreads e os atributos de maxIoThreads para o número máximo de threads para o processo para cada CPU. Por exemplo, se este valor for 25 num servidor de processador único, o ASP.NET utiliza as interfaces (APIs) de programação de aplicações run-time para definir o limite de processo para 25. Num servidor de dois processadores, o limite é definido para 50.

      Nota Monitorize a utilização da CPU quando aumenta um conjunto de threads para manter os limites.
    3. Guarde as alterações ao ficheiro Machine.config.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

  1. Iniciar Microsoft Visual Studio. NET.
  2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
  3. Clique em Projectos do Visual Basic ou Visual C# Projects em Tipos de projecto e clique em Aplicação de consola em modelos .
  4. Substitua o código na janela de código Aula1 com o seguinte código, dependendo do tipo de projecto:

    código Visual C# .NET
    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 a aplicação. Depois WorkerThreads disponíveis atinge o 0, receberá a mensagem de erro listada na secção "Sintomas".

Referências

Para obter mais informações, visite os seguintes Web sites da Microsoft:
Programar o conjunto 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

Artigo: 815637 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 815637

Submeter comentários

 

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