使用线程池的应用程序中使用 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.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
  5. 调试 菜单上单击 $ 开始 以运行该应用程序。可用 WorkerThreads 达到 0 后,您将收到"症状"部分中列出的错误消息。
参考
有关详细的信息,请访问以下 Microsoft 网站:
尝试...catch

Warning: This article has been translated automatically

属性

文章 ID:815637 - 上次审阅时间:02/26/2014 23:29:55 - 修订版本: 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
反馈