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 بإرجاع رسالة الخطأ بدلاً من وضع الطلب في قائمة الانتظار.
الحل البديل
كمحاولة للتغلب على هذه المشكلة استخدم إحدى الطرق التالية:
  • استخدام كتلة حاول التقاط في التعليمات البرمجية لجذب الاستثناء معالجة بشكل مناسب.
  • تطبيق آلية قائمة الانتظار للاحتفاظ الاستثناء حدوث.
  • في حالة استخدام ASP.NET في خدمات معلومات الإنترنت في Microsoft "على 5.0 أو أحدث إعادة تكوين حجم تجمع مؤشر الترابط في Machine.config الملف. للقيام بذلك، اتبع الخطوات التالية:
    1. فتح الملف Machine.config من المجلد \CONFIG Version \Microsoft.NET\Framework\ %Systemroot%.
    2. في المقطع <processmodel>الملف Machine.config بتكوين القيمةmaxWorkerThreads وسمات maxIoThreads إلى أقصى عدد من مؤشرات الترابط لعملية كل CPU. على سبيل المثال، إذا كانت هذه القيمة 25 على ملقم واحد المعالج ، يستخدم ASP.NET تطبيق وقت التشغيل (API) واجهات برمجة لتعيين حد عملية إلى 25. على ملقم المعالج اثنين يتم تعيين الحد إلى 50.

      ملاحظة مراقبة استخدام CPU زيادة تجمع مؤشرات ترابط للحفاظ على الحدود.
    3. حفظ التغييرات إلى الملف Machine.config.
تصريح
يعتبر هذا السلوك حسب التصميم.
معلومات أخرى
  1. البدء في Microsoft Visual Studio .NET.
  2. من القائمة ملف، أشر إلى جديد ثم انقر فوق المشروع.
  3. انقر فوق مشاريع Visual Basic أو Visual C# المشاريع ضمن أنواع Project ثم انقر فوق تطبيق وحدة التحكم ضمن قوالب.
  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 التالية على الويب:
برمجة تجمع مؤشر الترابط في .NET Framework
http://msdn2.microsoft.com/en-us/library/ms973903.aspx

<processmodel>العنصر
http://msdn2.microsoft.com/en-us/library/7w2sway1(vs.71).aspx
حاول الالتقاط

تحذير: تمت ترجمة هذا المقال تلقائياً

خصائص

رقم الموضوع: 815637 - آخر مراجعة: 02/27/2014 21:17:42 - المراجعة: 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 KbMtar
تعليقات