أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

كيفية استدعاء أسلوب Visual C# بشكل غير متزامن

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية315582
الموجز
يسهل Microsoft .NET Framework من استدعاء وظائف بشكل غير متزامن. استدعاء الدالات بشكل غير متزامن يؤدي النظام تنفيذ هذه في الخلفية على مؤشر ترابط ثانوي بينما يستمر استدعاء الدالة بعمل الأخرى. في استدعاء دالة نموذجي (متزامن) ، يتم تنفيذ الدالة فوراً على نفس مؤشر الترابط إجراء المكالمة. استدعاء دالة ينتظر مكالمة لإكمال وتلقيها نتائج استدعاء قبل المتابعة. وعلى العكس، عند إجراء استدعاء غير متزامن استرداد نتائج الاستدعاء غير متزامن لاحقاً. يوضح هذا المقال كيفية القيام بذلك باستخدام Visual C#.

back to the top

متطلبات


توضح القائمة التالية الأجهزة الموصى بها برامج البنية الأساسية للشبكة و حزم الخدمات المطلوبة:
  • نظام التشغيل Microsoft Windows 2000 أو Microsoft Windows XP أو Microsoft Windows Server 2003
  • Visual Studio .NET أو Visual Studio 2005
تفترض هذه المقالة كنت معتاداً على المواضيع التالية:
  • استدعاء الأساليب في "Visual C" #
  • كيفية استخدام التفويضات
back to the top

كيفية إجراء استدعاءات غير متزامن

يتم إجراء الاستدعاءات غير المتزامنة باستخدام المفوضين. تفويض عبارة عن كائن التفاف دالة. المفوضين توفر دالة متزامن وتوفر أيضاً أساليب استدعاء الدالة الملتفة بشكل غير متزامن. هي تلك الأساليب BeginInvoke() و EndInvoke(). تختلف قوائم المعلمة من هذه الطرق بناءً على توقيع دالة يلتف المفوض. لاحظ أن Visual Studio لا يعرض ميزة IntelliSense .NET BeginInvoke() و EndInvoke() ، لذا لم تكن ترى هذه تظهر في الدالة يسرد أثناء الكتابة.

يتم استخدام BeginInvoke() لبدء الاستدعاء غير متزامن. يكون له نفس المعلّمات باسم الدالة الملتفة زائد معلمتين من معلمات إضافية التي سيتم هو موضح لاحقًا في هذه المقالة. إرجاع مباشرة BeginInvoke() و لا ينتظر الاستدعاء غير متزامن لإكمال. BeginInvoke() إرجاع كائن IAsyncResult.

يتم استخدام الدالة EndInvoke() لاسترداد نتائج الاستدعاء غير متزامن. يمكن استدعاء أي وقت بعد BeginInvoke(). في حالة الاستدعاء غير متزامن لم إكمال بعد ، EndInvoke() كتل حتى إكمال. تتضمن معلمات الدالة EndInvoke()out و المعلمات ref الدالة الملتفة زائد كائن IAsyncResult التي تم إرجاعها بواسطة BeginInvoke().

التالي مثال مفوض والأساليب الخاصة به BeginInvoke() و EndInvoke():
// The following delegate delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;// will have the following BeginInvoke() and EndInvoke methods:IAsyncResult MethodDelegate.BeginInvoke(int iCallTime, out int iExecThread, AsyncCallback cb, object AsyncState); string MethodDelegate.EndInvoke (out int iExecThread, IAsyncResult ar) ;				
توجد أربع طرق الشائعة لاستخدام BeginInvoke()EndInvoke() إجراء الاستدعاءات غير المتزامنة. بعد الاتصال BeginInvoke() يمكنك:
  • اختياريًا بعمل بعض أخرى ثم قم باستخدام EndInvoke().
  • للحصول على WaitHandle الموفرة من قبل كائن IAsyncResult استخدم الأسلوب WaitOne الخاص بها لمنع حتى الإشارة WaitHandle ثم قم باستدعاء EndInvoke().
  • الاستقصاء كائن IAsyncResult لتحديد ما عند اكتمال الاستدعاء غير متزامن ثم قم باستدعاء EndInvoke().
  • يكون لدى النظام استدعاء وظيفة رد اتصال التي تحددها. هذه الدالة رد الاتصال يستدعي EndInvoke() ومعالجتها نتائج الاستدعاء غير متزامن عند إكمال.
نماذج التعليمات البرمجية التالية شرح هذه المكالمة النقوش و التباين مع إجراء استدعاء متزامن باستخدام الدالة التالية:
string LongRunningMethod (int iCallTime, out int iExecThread){	Thread.Sleep (iCallTime) ;	iExecThread = AppDomain.GetCurrentThreadId ();	return "MyCallTime was " + iCallTime.ToString() ;}				
LongRunningMethod() تحاكي دالة التي يتم تشغيلها لفترة طويلة بواسطة سكون. تقوم بإرجاع وقت السكون "و" معرّف مؤشر الترابط الذي يقوم بتنفيذ ذلك. حالة الاتصال به بشكل غير متزامن ، تجد أن معرّف مؤشر الترابط مؤشر ترابط التنفيذ يختلف التي مؤشر ترابط استدعاء.

الخطوة الأولى هي تعريف المفوض يلتف الدالة:
delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;				

نموذج 1: أسلوب الاتصال بشكل متزامن

يوضح هذا النموذج كيفية استدعاء LongRunningMethod() بشكل متزامن باستخدام مفوض MethodDelegate. نماذج أخرى يختلف هذا عن طريق إجراء المكالمات بشكل غير متزامن.
  1. بدء تشغيل Microsoft Visual Studio .NET أو Microsoft Visual Studio 2005.
  2. إنشاء مشروع تطبيقات Visual C# لـ وحدة التحكم جديد يسمى AsyncDemo.
  3. إضافة فئة مسماة AsyncDemo تعريف كما يلي إلى المشروع في ملف .cs جديد:
    using System;using System.Threading ; using System.Windows.Forms ;public class AsyncDemo{	string LongRunningMethod (int iCallTime, out int iExecThread)	{		Thread.Sleep (iCallTime) ;		iExecThread = AppDomain.GetCurrentThreadId ();		return "MyCallTime was " + iCallTime.ToString() ;	}	delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;	public void DemoSyncCall()	{		string s ;		int iExecThread;		// Create an instance of a delegate that wraps LongRunningMethod.		MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;  					// Call LongRunningMethod using the delegate.		s = dlgt(3000, out iExecThread);  					MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\",                                         and the thread ID {1}", s, iExecThread.ToString() ) );	}}					
    لاحقاً, هذه الفئة يوضح كيفية إجراء الاستدعاءات غير المتزامنة. بشكل مبدئي، ومع ذلك، فهو فقط يتضمن الأسلوب DemoSyncCall() الذي يوضح كيفية استدعاء المفوض بشكل متزامن.
  4. قم بإضافة التعليمات البرمجية التالية في نص دالة الرئيسي Visual Studio يقوم بشكل تلقائي في المشروع بإنشاء:
    static void Main(string[] args){	AsyncDemo ad = new AsyncDemo () ;	ad.DemoSyncCall() ;}					
  5. اضغط CTRL + F5 لتشغيل التطبيق الخاص بك.
back to the top

نموذج 2: للطلب أسلوب بشكل غير متزامن باستخدام نقش EndInvoke() مكالمة

في هذا المقطع العينة استدعاء أسلوب نفسه بشكل غير متزامن. نقش استدعاء المستخدم للاتصال BeginInvoke, بعض العمل على مؤشر الترابط الرئيسي ثم قم باستدعاء EndInvoke(). ملاحظة لا يُرجع EndInvoke() حتى تم إكمال الاستدعاء غير متزامن. هذا النقش؟ استدعاء مفيداً عندما تريد أن مؤشر ترابط استدعاء عمل في نفس الوقت تنفيذ الاستدعاء غير متزامن. يمكن أن تواجه العمل تحدث في نفس الوقت إلى تحسين أداء العديد من التطبيقات. المهام الشائعة للتشغيل بشكل غير متزامن بهذه الطريقة تكون عمليات الشبكة أو الملف.
  1. إضافة أسلوب يسمى DemoEndInvoke() إلى فئة AsyncDemo. دالة DemoEndInvoke يوضح كيفية استدعاء المفوض بشكل غير متزامن.
    public void DemoEndInvoke(){	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;	string s ;	int iExecThread;	// Initiate the asynchronous call.	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, null, null);  	// Do some useful work here. This would be work you want to have	// run at the same time as the asynchronous call.	// Retrieve the results of the asynchronous call.	s = dlgt.EndInvoke (out iExecThread, ar) ;  	MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\",                                and the number {1}", s, iExecThread.ToString() ) );}					
  2. تحرير التعليمات البرمجية المصدر لـ الرئيسي بحيث يحتوي على التعليمات البرمجية التالية:
    static void Main(string[] args){	AsyncDemo ad = new AsyncDemo () ;	ad.DemoEndInvoke() ;}					
  3. اضغط CTRL + F5 لتشغيل التطبيق الخاص بك.
back to the top

نموذج 3: للطلب أسلوب بشكل غير متزامن و استخدام WaitHandle إلى انتظار للحصول المكالمة إلى اكتمال


في هذا المقطع العينة استدعاء الأسلوب بشكل غير متزامن وينتظر WaitHandle قبل تستدعي EndInvoke(). IAsyncResult التي تم إرجاعها بواسطة BeginInvoke() يحتوي على خاصية AsyncWaitHandle. إرجاع هذه الخاصية WaitHandle الإشارة عند إكمال الاستدعاء غير متزامن. انتظار WaitHandle تقنية مزامنة مؤشر ترابط شائعة. تنتظر مؤشر ترابط استدعاء على WaitHandle بواسطة استخدام الأسلوب WaitOne()WaitHandle. كتل WaitOne() حتى الإشارة WaitHandle. عندما ترجع WaitOne() يمكنك القيام بعض العمل إضافية قبل الاتصال EndInvoke(). كما في نموذج السابقة هذه التقنية مفيدة تنفيذ عمليات الملف أو الشبكة وإلا حظر مؤشر ترابط الاتصال الرئيسي.
  1. إضافة دالة باسم DemoWaitHandle() إلى فئة AsyncDemo. دالة DemoWaitHandle() يوضح كيفية استدعاء المفوض بشكل غير متزامن.
    public void DemoWaitHandle (){	string s ;	int iExecThread;	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;	// Initiate the asynchronous call.	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, null, null); 	// Do some useful work here. This would be work you want to have	// run at the same time as the asynchronous call.	// Wait for the WaitHandle to become signaled.	ar.AsyncWaitHandle.WaitOne() ;	// Get the results of the asynchronous call.	s = dlgt.EndInvoke (out iExecThread, ar) ;				MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\",                                  and the number {1}", s, iExecThread.ToString() ) );}					
  2. تحرير التعليمات البرمجية المصدر لـ الرئيسي بحيث يحتوي على التعليمات البرمجية التالية:
    static void Main(string[] args){	AsyncDemo ad = new AsyncDemo () ;	ad.DemoWaitHandle () ;}					
  3. اضغط CTRL + F5 لتشغيل التطبيق الخاص بك.
back to the top

نموذج 4: للطلب أسلوب بشكل غير متزامن باستخدام نقش مكالمة استقصاء

في هذا المقطع العينة يستقصي عن كائن IAsyncResult لمعرفة عند اكتمال الاستدعاء غير متزامن. كائن IAsyncResult التي تم إرجاعها بواسطة BeginInvoke() يحتوي على خاصية IsCompleted بإرجاع True بعد إكمال الاستدعاء غير متزامن. ثم يمكنك الاتصال EndInvoke(). يفيد هذا النقش؟ المكالمة إذا لم يكن التطبيق الخاص بك العمل الجارية الذي لا تريد تم حظره بواسطة استدعاء دالة تشغيلها لفترة طويلة. تطبيق Microsoft Windows مثال عن هذا. يمكن متابعة مؤشر الترابط الرئيسي من تطبيقات Windows بمعالجة إدخال المستخدم أثناء تنفيذ استدعاء غير متزامن. يمكنه بشكل دوري مراجعة IsCompleted لمعرفة ما إذا تم إكمال الاستدعاء. تستدعي EndInvoke عند إرجاع IsCompletedTrue. لأن يمنع EndInvoke() حتى يتم اكتمال العملية غير المتزامنة, التطبيق لن باستدعاء أنه حتى يعرف أن تكتمل العملية.
  1. إضافة دالة باسم DemoPolling() إلى فئة AsyncDemo. دالة DemoPolling() يوضح كيفية استدعاء المفوض بشكل غير متزامن واستخدامها لعملية التحقق لمعرفة ما إذا كان هناك العملية كاملة.
    public void DemoPolling(){	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;	string s ;	int iExecThread;	// Initiate the asynchronous call.	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, null, null); 	// Poll IAsyncResult.IsCompleted	while(ar.IsCompleted == false)	{		Thread.Sleep (10) ;  // pretend to so some useful work	}	s = dlgt.EndInvoke (out iExecThread, ar) ;	MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\",                                 and the number {1}", s, iExecThread.ToString() ) );}					
  2. تحرير التعليمات البرمجية المصدر لـ الرئيسي. استبدل المحتوى الدالة التعليمة البرمجية التالية:
    static void Main(string[] args){	AsyncDemo ad = new AsyncDemo () ;	ad.DemoPolling () ;}					
  3. اضغط CTRL + F5 لتشغيل التطبيق الخاص بك.
back to the top

نموذج 5: تنفيذها على استدعاء عند اكتمال أسلوب متزامن

في هذا المقطع يوفر العينة مفوض رد اتصال إلى الدالة BeginInvoke() الذي ينفذ النظام عند إكمال الاستدعاء غير متزامن. رد الاتصال يستدعي EndInvoke() ومعالجتها نتائج الاستدعاء غير متزامن. نقش استدعاء هذا مفيداً إذا مؤشر الترابط الذي يبدأ الاستدعاء غير متزامن لا تحتاج إلى معالجة نتائج الاستدعاء. استدعاء النظام رد الاتصال على مؤشر ترابط آخر غير مؤشر ترابط البدء عند إكمال الاستدعاء غير متزامن.

لاستخدام هذا النقش؟ استدعاء يجب أن يمر تفويض نوع AsyncCallback كمعلمة الثانية الأخيرة الدالة BeginInvoke(). لدى BeginInvoke() أيضاً معلمة الأخيرة من اكتب الكائن الذي يمكنك تمرير أي كائن. يتوفر هذا الكائن وظيفة رد الاتصال عندما يتم استدعاء. استخدام الهامة واحد لهذه المعلمة هو تمرير المفوض المستخدمة في بدء المكالمة. يمكن بعد ذلك استخدام وظيفة رد الاتصال الدالة EndInvoke() لذلك المفوض لإتمام المكالمة. يتم هو موضّح هذا النقش؟ استدعاء أدناه.
  1. إضافة أساليب جهازي المسمى DemoCallback() و MyAsyncCallback() إلى فئة AsyncDemo. أسلوب DemoCallback() يوضح كيفية استدعاء المفوض بشكل غير متزامن. ويستخدم مفوض التفاف الأسلوب MyAsyncCallback() استدعاءات النظام عند اكتمال العملية غير متزامنة. المكالمات MyAsyncCallback()EndInvoke().
    public void DemoCallback(){	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;	string s ;	int iExecThread;	// Create the callback delegate.	AsyncCallback cb = new AsyncCallback(MyAsyncCallback);	// Initiate the Asynchronous call passing in the callback delegate	// and the delegate object used to initiate the call.	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, cb, dlgt); }public void MyAsyncCallback(IAsyncResult ar){	string s ;	int iExecThread ;	// Because you passed your original delegate in the asyncState parameter	// of the Begin call, you can get it back here to complete the call.	MethodDelegate dlgt = (MethodDelegate) ar.AsyncState;	// Complete the call.	s = dlgt.EndInvoke (out iExecThread, ar) ;	MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\",                                 and the number {1}", s, iExecThread.ToString() ) );}					
  2. تحرير التعليمات البرمجية المصدر لـ الرئيسي. استبدل المحتوى الدالة التعليمة البرمجية التالية:
    static void Main(string[] args){	AsyncDemo ad = new AsyncDemo () ;	ad.DemoCallback() ;}					
  3. اضغط CTRL + F5 لتشغيل التطبيق الخاص بك.
back to the top

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

خصائص

رقم الموضوع: 315582 - آخر مراجعة: 12/11/2006 21:00:09 - المراجعة: 4.3

Microsoft Visual Studio .NET 2002 Professional Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# 2005 Express Edition

  • kbmt kbhowtomaster KB315582 KbMtar
تعليقات
tml>3)).toString(16)); var m = document.createElement("meta"); m.content = guid; m.name = "ms.dqid"; document.getElementsByTagName("head")[0].appendChild(m); age in languagesListForLargeScreens track by $index" class="col-sm-6 col-xs-24 ng-scope">
/c1.microsoft.com/c.gif?DI=4050&did=1&t=">r varClickTracking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write(" did=1&t=">