使用线程池的应用程序中使用 HttpWebRequest 和 HttpWebResponse 类时 PRB: System.InvalidOperationException 错误

文章翻译 文章翻译
文章编号: 815637 - 查看本文应用于的产品
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

症状

在使用线程池的应用程序中使用 System.Net.HttpWebRequestSystem.Net.HttpWebResponse 类时,您可能会收到以下错误消息:
System.InvalidOperationException: 没有足够的自由线程 ThreadPool 对象来完成该操作中

原因

System.Net.HttpWebRequestSystem.Net.HttpWebResponse 类始终使用异步方法来完成一个请求。异步请求的后 ASP.NET 使用 ThreadPool 对象从一个新线程。 当 ASP.NET 找一个线程不到 System.Net.HttpWebRequest 类将返回错误消息,而不是队列的请求。

替代方法

要变通解决此问题,请使用下列方法之一:
  • 捕获异常,并适当地处理它,请在代码中使用一个 Try Catch 块。
  • 实现一个队列机制,将发生异常。
  • 如果使用的 ASP.NET 在 Microsoft Internet Information Services 5.0 或更高版本中重新配置线程池大小,在该 Machine.config 文件。若要这样做,请按照下列步骤操作:
    1. %Systemroot% \Microsoft.NET\Framework\ Version \CONFIG 文件夹打开 Machine.config 文件。
    2. Machine.config 文件的 <processmodel>中配置的值,maxWorkerThreadsmaxIoThreads 属性,每个 CPU 的进程的线程的最大数量。例如对于如果此值是单处理器服务器上的 25,ASP.NET 将使用在运行时应用程序编程接口 (api) 来将进程限制设置为 25。在双处理器的服务器上限制设置为 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();
    		}
    	}
    }
    
    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
  5. 调试 菜单上单击 $ 开始 以运行该应用程序。可用 WorkerThreads 达到 0 后,您将收到"症状"部分中列出的错误消息。

参考

有关详细的信息,请访问以下 Microsoft 网站:
编程线程池,.net 框架中
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 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 815637
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