PRB: System.InvalidOperationException 응용 프로그램의 스레드 풀 함께 HttpWebResponse 클래스 및 HttpWebRequest를 사용하면 오류

기술 자료 번역 기술 자료 번역
기술 자료: 815637 - 이 문서가 적용되는 제품 보기.
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
모두 확대 | 모두 축소

현상

스레드 풀을 사용하는 응용 프로그램에서 System.Net.HttpWebRequestSystem.Net.HttpWebResponse 클래스를 사용할 때 다음과 같은 오류 메시지가 나타날 수 있습니다.
System.InvalidOperationException: 저기 않았습니다 충분한 사용 가능한 스레드가 작업을 완료할 수 있는 ThreadPool 개체의

원인

System.Net.HttpWebRequestSystem.Net.HttpWebResponse 클래스를 항상 비동기 메서드를 사용하여 요청을 완료합니다. 비동기 요청이 있을 때 ASP.NET ThreadPool 개체에서 새 스레드를 사용합니다. ASP.NET 스레드를 찾을 때 System.Net.HttpWebRequest 클래스 요청 대기열 대신 오류 메시지를 반환합니다.

해결 과정

이 문제를 해결하려면 다음 방법 중 하나를 사용하십시오.
  • Try Catch 블록을 코드에서 예외를 catch 적절하게 처리할 수 있습니다.
  • 예외가 발생하지 유지하려면 큐 메커니즘을 구현하십시오.
  • ASP.NET Microsoft 인터넷 정보 서비스 5 이상을 사용하는 경우 해당 Machine.config의 스레드 풀의 크기를 다시 파일. 이렇게 하려면 다음과 같이 하십시오.
    1. %Systemroot% \Microsoft.NET\Framework\ Version \CONFIG 폴더에서 Machine.config 파일을 엽니다.
    2. Machine.config 파일 <processmodel>섹션에서 값을 구성하는 경우maxWorkerThreadsmaxIoThreads 특성을 각 CPU 프로세스에 대한 스레드 최대 수. 25 단일 프로세서 서버에서 이 값이 없는 경우 예를 들어, ASP.NET 런타임 응용 프로그래밍 인터페이스 (API) 프로세스 제한을 25로 설정하는 예제입니다. 2-프로세서 서버에서 제한이 50으로 설정됩니다.

      참고 제한을 유지하려면 스레드 풀에 늘릴 때 CPU 사용을 모니터링하십시오.
    3. Machine.config 파일에 변경 내용을 저장하십시오.

현재 상태

이것은 의도적으로 설계된 동작입니다.

추가 정보

  1. Microsoft Visual Studio .NET 시작입니다.
  2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트 를 클릭하십시오.
  3. 프로젝트 형식Visual Basic 프로젝트 또는 Visual C# 프로젝트 를 클릭한 다음 템플릿 에서 콘솔 응용 프로그램 을 누릅니다.
  4. Class1 코드 창에서 코드를 프로젝트 형식에 따라 다음 코드로 대체하십시오.

    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 도달하면 "현상" 절에 나열된 오류 메시지가 나타납니다.

참조

자세한 내용은 다음 Microsoft 웹 사이트를 방문 하시기 바랍니다:
스레드 풀 .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 kbmt kbnamespace kbweb kbxml kbwnet kberrmsg kbconfig kbdev kbthread kbprb KB815637 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

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