PRB: System.InvalidOperationException エラー HttpWebRequest と HttpWebResponse クラスをスレッド プールでのアプリケーションで使用すると

文書翻訳 文書翻訳
文書番号: 815637 - 対象製品
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
すべて展開する | すべて折りたたむ

現象

スレッド プールを使用するアプリケーションで、 System.Net.HttpWebRequest および System.Net.HttpWebResponse クラスを使用すると、次のエラー メッセージが表示されます可能性があります。
System.InvalidOperationException: が十分な空きスレッドにない操作を完了するには、ThreadPool オブジェクト

原因

System.Net.HttpWebRequest および System.Net.HttpWebResponse クラスを常に使用非同期メソッドを要求を完了します。 非同期要求が行われると ASP.NET では、 ThreadPool オブジェクトから新しいスレッドを使用します。 ASP.NET が、スレッドを見つけられないときに、 System.Net.HttpWebRequest クラスは、要求をキュー instead of、エラー メッセージを返します。

回避策

この問題を回避するには、いずれか、次の方法の使用します。
  • 例外をキャッチして適切に処理するコードで Try Catch ブロックを使用します。
  • 発生から例外を保持するキュー メカニズムを実装します。
  • Microsoft インターネット インフォメーション サービス 5. 0 以降の ASP.NET を使用している場合は、Machine.config で、スレッド プールのサイズを再構成ファイル。 これを行うには、次の手順を実行します。
    1. %Systemroot% \Microsoft.NET\Framework\ Version \CONFIG フォルダーから Machine.config ファイルを開きます。
    2. [Machine.config ファイルの <processmodel>] セクションの値を構成します maxWorkerThreads と各 CPU のプロセスのスレッドの最大数に maxIoThreads 属性。 たとえば、この値が 25 シングル プロセッサ サーバーと ASP.NET には、プロセスの制限を 25 に設定する、ランタイム アプリケーション プログラミング インターフェイス (API) は使用してください。 2 プロセッサ サーバーで、制限が 50 に設定します。

      メモ 制限値を保持するスレッド プールを大きくと、CPU 使用率を監視します。
    3. 変更を行った Machine.config ファイルを保存します。

状況

これは仕様によるものです。

詳細

  1. Microsoft Visual Studio .NET を開始します。
  2. [ ファイル ] メニューの [ 新規作成 ] をポイントし、[ プロジェクト ] をクリックします。
  3. [ テンプレート ] ボックスの一覧の [ コンソール アプリケーション を [ プロジェクトの種類 ] で [ Visual Basic プロジェクト ] または [ Visual C# プロジェクト をクリックします。
  4. クラス 1 のコード ウィンドウでコードをプロジェクトの種類に応じて、次のコードに置き換えます。

    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();
    		}
    	}
    }
    
    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. [ デバッグ ] の [ 開始 のアプリケーションを実行する] をクリックします。 利用可能な WorkerThreads が、0 に達すると、「現象」に記載されているエラー メッセージが表示されます。

関連情報

詳細については、次のマイクロソフト Web サイトを参照してください。
.NET Framework で、スレッド プールのプログラミング
http://msdn2.microsoft.com/en-us/library/ms973903.aspx

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

プロパティ

文書番号: 815637 - 最終更新日: 2014年2月26日 - リビジョン: 1.4
この資料は以下の製品について記述したものです。
  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 1.1
キーワード:?
kbnosurvey kbarchive kberrmsg kbthread kbnamespace kbweb kbxml kbwnet kbprb kbconfig kbdev kbmt KB815637 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:815637
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

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