MODÈLE : System.InvalidOperationException erreur lorsque vous utilisez HttpWebRequest et classes HttpWebResponse dans application avec le pool de threads

Traductions disponibles Traductions disponibles
Numéro d'article: 815637 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Agrandir tout | Réduire tout

Symptômes

Lorsque vous utilisez le System.Net.HttpWebRequest et les classes System.Net.HttpWebResponse dans une application qui utilise un pool de threads, le message d'erreur suivant peut s'afficher :
System.InvalidOperationException : il n'étaient suffisamment threads libres pas dans l'objet de pool de threads pour terminer l'opération

Cause

Le System.Net.HttpWebRequest et le System.Net.HttpWebResponse classes toujours utilisent les méthodes asynchrones pour terminer une demande. Lorsque la requête asynchrone est effectuée, ASP.NET utilise un nouveau thread de l'objet de pool de threads . Lorsque ASP.NET ne trouve pas un thread, la classe System.Net.HttpWebRequest renvoie la message d'erreur instead of la demande de file d'attente.

Contournement

Pour contourner ce problème, appliquez l'une des méthodes suivantes :
  • Utilisez un bloc try-catch dans le code pour intercepter l'exception et pour gérer correctement.
  • Implémenter un mécanisme de mise en file d'attente pour conserver l'exception de se produire.
  • Si vous utilisez ASP.NET dans Microsoft Internet Information Services 5.0 ou version ultérieure, reconfigurer la taille thread du pool dans machine.config le fichier. Pour ce faire, procédez comme suit :
    1. Ouvrez le fichier machine.config dans le dossier %Systemroot% \Microsoft.NET\Framework\ \CONFIG Version.
    2. Dans la section <processmodel> du fichier Machine.config, configurez la valeur de la maxWorkerThreads et les attributs maxIoThreads le nombre maximal de threads pour le processus pour chaque processeur. Par exemple, si cette valeur est 25 sur un serveur seul processeur, ASP.NET utilise l'application d'exécution programming interfaces (API) pour définir la limite de processus à 25. Sur un serveur à deux processeurs, la limite est définie à 50.

      note Contrôler l'utilisation du processeur lorsque vous augmentez un pool de threads pour maintenir les limites.
    3. Enregistrer les modifications dans le fichier machine.config.

Statut

Ce comportement est voulu par la conception même du produit.

Plus d'informations

  1. Début Microsoft Visual Studio .NET.
  2. Dans le menu Fichier , pointez sur Nouveau , puis cliquez sur projet .
  3. Cliquez sur projets Visual Basic ou des projets Visual C# sous types de projet , puis cliquez sur application console sous modèles .
  4. Remplacez le code dans la fenêtre de code Class1 par le code suivant, selon votre type de projet :

    Visual C# .NET code
    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();
    		}
    	}
    }
    
    code 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
    myHttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse) myHttpWebResponse.Close() End Sub End module
  5. Dans le menu Déboguer , cliquez sur Démarrer pour exécuter l'application. Après que la WorkerThreads disponible atteint 0, vous recevez le message d'erreur est répertorié dans la section « Symptômes ».

Références

Pour plus d'informations, reportez-vous au adresse aux sites Web de Microsoft aux adresses suivantes :
Programmation le pool de threads dans .NET Framework
http://msdn2.microsoft.com/en-us/library/ms973903.aspx

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

Propriétés

Numéro d'article: 815637 - Dernière mise à jour: mercredi 26 février 2014 - Version: 1.4
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 1.1
Mots-clés : 
kbnosurvey kbarchive kbmt kbnamespace kbweb kbxml kbwnet kberrmsg kbconfig kbdev kbthread kbprb KB815637 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 815637
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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