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
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.
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:
Abra o ficheiro Machine.config da pasta %Systemroot% \Microsoft.NET\Framework\ Version \Config.
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.
No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
Clique em Projectos do Visual Basic ou Visual C# Projects em Tipos de projecto e clique em Aplicação de consola em modelos .
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
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".
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
Qual foi o esforço que despendeu pessoalmente para utilizar este artigo?
Muito baixo
Baixo
Moderado
Elevado
Muito elevado
Diga-nos porquê e o que podemos fazer para melhorar estas informações
Obrigado! Os seus comentários são utilizados para ajudar-nos a melhorar o conteúdo do nosso suporte. Para obter mais opções de assistência, visite a Home Page de Ajuda e Suporte.