Cuando se utiliza el System.NET.HttpWebRequest y las clases System.NET.HttpWebResponse en una aplicación que utiliza un grupo de subprocesos, puede recibir el siguiente mensaje de error:
System.InvalidOperationException: no hubo suficientes subprocesos libres en el objeto ThreadPool para completar la operación
El System.NET.HttpWebRequest y System.NET.HttpWebResponse de la clases siempre utilice los métodos asincrónicos para completar una solicitud. Cuando se realiza la solicitud asincrónica, ASP.NET utiliza un nuevo subproceso desde el objeto ThreadPool . Cuando ASP.NET no encuentra un subproceso, la clase System.NET.HttpWebRequest devuelve mensaje de error instead of cola la solicitud.
Para evitar este problema, utilice uno de los métodos siguientes:
Utilice un bloque try-catch en el código para detectar la excepción y controlarla adecuadamente.
Implementar un mecanismo cola para mantener la excepción se produzca.
Si utiliza ASP.NET en servicios de Microsoft Internet Information Server 5.0 o posterior, vuelva a configurar el tamaño del grupo de subprocesos en el archivo Machine.config archivo. Para ello, siga estos pasos:
Abra el archivo Machine.config desde la carpeta de Version \Config \Microsoft.NET\Framework\ %Systemroot%.
En la sección <processmodel> del archivo Machine.config, configure el valor de la maxWorkerThreads y los atributos maxIoThreads al número máximo de subprocesos para el proceso para cada CPU. Por ejemplo, si este valor es 25 en el servidor con un único procesador, ASP.NET utiliza la aplicación (API) de interfaces de programación en tiempo de ejecución para establecer el límite de proceso en 25. En un servidor con dos procesadores, el límite se establece en 50.
Nota Supervise el uso de CPU cuando aumentar un grupo de subprocesos para mantener los límites.
En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
Haga clic en Proyectos de Visual Basic o Proyectos de Visual C# en Tipos de proyecto y, a continuación, haga clic en Aplicación de consola , bajo plantillas .
Reemplace el código en la ventana de código de Class1 con el código siguiente, dependiendo del tipo de proyecto:
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();
}
}
}
Visual Basic .NET Code
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
En el menú Depurar , haga clic en iniciar para ejecutar la aplicación. Después de la WorkerThreads disponible llega a 0, recibirá el mensaje de error enumerados en la sección "Síntomas".
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 815637
(http://support.microsoft.com/kb/815637/en-us/
)
Proporcione sus comentarios acerca de esta información
¿Esta información le ayudó a resolver su problema?
Sí
No
No lo sé
¿La información era relevante?
Sí
No
¿Qué podemos hacer para mejorar esta información?
Para proteger su privacidad, no incluya información de contacto en los comentarios.
¡Muchas gracias! Sus comentarios nos ayudarán a mejorar los contenidos de soporte. Para más opciones de asistencia, visite la página de Ayuda y soporte técnico.