Votre navigateur n’est pas pris en charge

Vous devez mettre à jour votre navigateur pour utiliser le site.

Mettre à jour vers la dernière version d’Internet Explorer

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

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.

815637
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
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.IOImports System.NetImports System.TextImports System.ThreadingImports System.Net.SocketsModule 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 SubEnd 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 :
essayez... catch

Avertissement : cet article a été traduit automatiquement

Propriétés

ID d'article : 815637 - Dernière mise à jour : 02/26/2014 23:29:54 - Révision : 1.4

  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 1.1
  • kbnosurvey kbarchive kbmt kbnamespace kbweb kbxml kbwnet kberrmsg kbconfig kbdev kbthread kbprb KB815637 KbMtfr
Commentaires