PRB: Error en System.InvalidOperationException al utilizar HttpWebRequest y HttpWebResponse clases en la aplicación con el grupo de subprocesos

Seleccione idioma Seleccione idioma
Id. de artículo: 815637 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

Síntomas

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

Causa

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.

Solución

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:
    1. Abra el archivo Machine.config desde la carpeta de Version \Config \Microsoft.NET\Framework\ %Systemroot%.
    2. 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.
    3. Guarde los cambios del archivo Machine.config.

Estado

Este comportamiento es por diseño.

Más información

  1. Iniciar Microsoft Visual Studio .NET.
  2. En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
  3. 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 .
  4. 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
  5. 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".

Referencias

Para obtener más información, visite los siguientes sitios Web de Microsoft (pueden estar en inglés):
Programación del grupo de subprocesos en .NET Framework
http://msdn2.microsoft.com/en-us/library/ms973903.aspx

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

Propiedades

Id. de artículo: 815637 - Última revisión: jueves, 27 de febrero de 2014 - Versión: 1.4
La información de este artículo se refiere a:
  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 1.1
Palabras clave: 
kbnosurvey kbarchive kbmt kbnamespace kbweb kbxml kbwnet kberrmsg kbconfig kbdev kbthread kbprb KB815637 KbMtes
Traducción automática
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

Enviar comentarios

 

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