مشاركة عبر


نظرة عامة تستند إلى حدث غير متزامن نقش حول

Applications that perform many tasks simultaneously, yet remain responsive إلى مستخدم تفاعل, often require a تصميم that uses multiple عمليات جزئية. The System.Threading مساحة الاسم provides الجميع the أدوات necessary إلى إنشاء عالي-الأداء multithreaded applications, but using these أدوات effectively يتطلب significant تجربة مع multithreaded software engineering. For relatively simple multithreaded applications, the BackgroundWorker مكوّن provides a straightforward الحل. للتطبيقات غير المتزامنة أكثر تعقيداً، يجب مراعاة تطبيق فئة يلتزم ب غير متزامن تستند إلى حدث نقش.

The حدث-based نمط غير متزامن makes متوفر the advantages of multithreaded applications while hiding many of the complex issues inherent في multithreaded تصميم. Using a فئة that supports this نقش can allow you إلى:

  • Perform الوقت-consuming tasks, such كـ التنزيلات و قاعدة بيانات العمليات, "في the الخلفية," without interrupting your تطبيق.

  • ينفذ multiple العمليات simultaneously, receiving الإخطارات when each completes.

  • Wait for موارد إلى become متوفر without stopping ("hanging") your تطبيق.

  • Communicate مع معلّقة غير متزامن العمليات using the familiar أحداث-و-المفوضون model. For المزيد معلومات تشغيل using حدث handlers و المفوضون, see أحداث و مفوضون.

أن فئة تعتمد "نقش غير متزامن" يستند إلى حدث واحد أو المزيد أساليب باسم من MethodNameAsync. قد تعكس هذه الطرق متزامن الإصدارات، قم بإجراء نفس العملية تشغيل مسار التنفيذ الحالي. كما أن الفئة من MethodNameCompleted حدث وربما تجد MethodNameAsyncCancel (أو simplyCancelAsync).

PictureBoxهو نموذجي مكون يعتمد يستند إلى حدث غير متزامن النقش. يمكنك ينزّل نسخة بشكل متزامن باستدعاء له Loadالأسلوب، ولكن إذا كانت النسخة هو قطر أيمن متوسط، أو إذا كان اتصال شبكة الاتصال هو بطيئة، تطبيق الخاص بك سيتوقف ("يعلق") إلى أن عملية التحميل هو مكتمل الاستدعاء Loadإرجاع.

إذا كنت ترغب في تطبيق الخاص بك للاحتفاظ بتشغيل أثناء الصورة هو تحميل، يمكنك استدعاء LoadAsyncالأسلوب ومؤشر LoadCompletedحدث، تماما كما سيتم التعامل مع أي الأخرى حدث. عندما تقوم باستدعاء LoadAsyncالأسلوب، سيتم متابعة تطبيق الخاص بك لتشغيل أثناء ينزّل يبدأ في مؤشر ترابط منفصل ("في الخلفيه"). سوف يتم استدعاء معالج الأحداث الخاص بك عند اكتمال عملية التحميل بالصور، ويمكن لمعالج الأحداث الخاص بك فحص AsyncCompletedEventArgsمعلمة لتحديد ما إذا كان ينزّل بنجاح.

تستند إلى الحدث غير متزامن النقش يتطلب أن غير متزامن يمكن أن يتم إلغاء العملية، و PictureBoxيعتمد عنصر التحكم هذا المطلب مع به CancelAsyncالأسلوب. استدعاء CancelAsyncبإرسال طلب لإيقاف تعليق ينزّل، وعندما يتم إلغاء مهمة، LoadCompletedتشغيل حدث.

ملاحظة تنبيهتنبيه

هو يمكن أن يتم التحميل finهوh تماما كما CancelAsyncطلب هو التي تم إجراؤها، بذلك Cancelledقد لا يعكس الطلب إلى "إلغاء الأمر".Th هو هو يطلق على حالة تنافس و هو عامة هو sue في البرمجة ذات مؤشرات ترابط متعددة.ل المزيد المعلومات حول مشكلات في البرمجة ذات مؤشرات ترابط متعددة، راجع مدارة مؤشر الترابط التشعبي أفضل الممارسات.

الصفات المميزة للأحداث المستندة إلى غير متزامن نقش

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

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

من الأمثلة حدث يستند إلى غير متزامن نقش

SoundPlayerو PictureBoxمكونات تمثل تطبيقات بسيطة غير متزامن تستند إلى حدث نقش. WebClientو BackgroundWorkerتمثل مكونات أكثر تعقيداً تطبيقات تستند إلى حدث غير متزامن نقش.

أسفل هو إعلان فئة مثال وفق النمط:

Public Class AsyncExample
    ' Synchronous methods.
    Public Function Method1(ByVal param As String) As Integer 
    Public Sub Method2(ByVal param As Double) 

    ' Asynchronous methods.
    Overloads Public Sub Method1Async(ByVal param As String) 
    Overloads Public Sub Method1Async(ByVal param As String, ByVal userState As Object) 
    Public Event Method1Completed As Method1CompletedEventHandler

    Overloads Public Sub Method2Async(ByVal param As Double) 
    Overloads Public Sub Method2Async(ByVal param As Double, ByVal userState As Object) 
    Public Event Method2Completed As Method2CompletedEventHandler

    Public Sub CancelAsync(ByVal userState As Object) 

    Public ReadOnly Property IsBusy () As Boolean

    ' Class implementation not shown.
End Class
public class AsyncExample
{
    // Synchronous methods.
    public int Method1(string param);
    public void Method2(double param);

    // Asynchronous methods.
    public void Method1Async(string param);
    public void Method1Async(string param, object userState);
    public event Method1CompletedEventHandler Method1Completed;

    public void Method2Async(double param);
    public void Method2Async(double param, object userState);
    public event Method2CompletedEventHandler Method2Completed;

    public void CancelAsync(object userState);

    public bool IsBusy { get; }

    // Class implementation not shown.
}

وهمية AsyncExampleلدى فئة أسلوبين كلا منها يعتمد متزامنة و غير متزامن invocations. تتصرف التحميلات الزائدة المتزامنة مثل استدعاء أي أسلوب وتنفيذ العملية تشغيل مؤشر ترابط استدعاء؛ إذا كانت العملية هو مستهلكاً للوقت، قد يكون هناك تأخير ملحوظا قبل إرجاع الاستدعاء. غير متزامن التحميلات الزائدة سيتم يبدأ العملية على مؤشر ترابط آخر ثم قم بالرجوع مباشرة، مما يسمح لمؤشر ترابط استدعاء لمتابعة أثناء تنفيذ العملية "في الخلفية."

غير متزامن أسلوب التحميلات الزائدة

هناك التحميلات الزائدة الثاني من المحتمل أن يكون غير متزامن العمليات: واحد من استدعاء و الاستدعاء بمتعددة. يمكنك التمييز بين نموذجين هذه عن طريق بهم أسلوب التواقيع: استدعاء المتعددة نموذج يحتوي على معلمة إضافية تسمى userState. هذا النموذج يجعل من الممكن للتعليمات البرمجية لإجراء مكالمة Method1Async(string param, object userState)عدة مرة/مرات دون انتظار لأي تعليق غير متزامن على عمليات الإنهاء. إذا، من ناحية غير ذلك، حاول إلى استدعاء Method1Async(string param)قبل اكتمال أن الطلب سابق، يرفع الأسلوب InvalidOperationException.

userStateمعلمة التحميلات الزائدة متعددة-استدعاء يسمح لك بالتمييز بين غير متزامن. عمليات توفير القيمة فريدة (على سبيل المثال، معرف فريد عمومي أو تجزئة رمز) لكل استدعاء إلى Method1Async(string param, object userState)، وعند كل عملية هو إكمال معالج الأحداث الخاص بك يمكن تحديد أي مثيل raهوed عملية إكمال حدث.

تعقب العمليات معلّقة

إذا قمت باستخدام التحميلات الزائدة متعددة-استدعاء من تعليمات برمجية الخاصة بك بحاجة إلى التمكن من مقطع صوتي userStateالكائنات (معرفات المهام) لتعليق المهام. لكل استدعاء إلى Method1Async(string param, object userState)، سوف عادة توليد جديد، فريد userStateالكائن وإضافته إلى المجموعة. عند مطابقة مهمة إلى userStateهذا يرفع كائن حدث الإكمال وسيتم تطبيق الأسلوب الاكتمال فحص AsyncCompletedEventArgs.UserStateوإزالته من مجموعة. استخدام هذه الطريقة، userStateتأخذ معلمة دور مهمة المعرف.

ملاحظةملاحظة

يجب أن تكون حريصا على توفير القيمة فريدة ل userStateفي المكالمات إلى التحميلات الزائدة متعددة-الاستدعاء.مهمة غير فريد معرفات سيتسبب غير متزامن فئة الإلقاء ArgumentException.

يتم إلغاء الأمر العمليات المعلقة

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

تأخذ الأساليب التي تسمح invocations متعددة userStateمعلمة، والذي يمكن استخدامه إلى تعقب عمر كل مهمة. CancelAsyncتأخذuserStateمعلمة، مما يسمح لك إلى إلغاء معينة المعلقة مهام.

الأساليب التي تدعم مفرد معلّقة تشغيل في وقت ما، مثل Method1Async(string param)، ليست cancelable.

تلقي تحديثات التقدم و نتائج تزايدي

فئة يلتزم إلى "نقش غير متزامن" يستند إلى حدث قد اختيارياً توفير حدث تعقب التقدم و تزايدي النتائج. هذا سوف عادة أن يسمى ProgressChangedأو MethodNameProgressChanged، و hوler حدث المطابق له نافذة ProgressChangedEventArgsمعلمة.

The event handler for the ProgressChangedevent can examine the ProgressChangedEventArgs.ProgressPercentage property to determine what percentage of an asynchronous task has been completed. هذه الخاصية سوف يتراوح من 0 إلى 100، و يمكن استخدامها لتحديث Valueخاصية ProgressBar. إذا كانت متعددة غير متزامن العمليات المعلقة، يمكنك استخدام ProgressChangedEventArgs.UserStateخاصية للتمييز بالإعلام عن تشغيل التي تقدم.

بعض الفئات قد الإبلاغ عن نتائج تزايدي ك غير متزامن العمليات المتابعة. سيتم تخزين هذه نتائج في clكـs مشتقة من ProgressChangedEventArgsوسوف تظهر كـ الخصائص في المشتق clكـs. يمكنك الوصول إلى هذه نتائج في معالج الأحداث ل ProgressChangedالحدث، فقط كـ قد تصل ProgressPercentageخاصية. إذا كانت العديد من العمليات غير المتزامنة معلقة، يمكنك استخدام UserStateخاصية إلى dهوtinguهوh تشغيل التي هو الإعلام عن نتائج التزايدية.

راجع أيضًا:

المهام

كيفية القيام بما يلي: استخدم المكونات التي تقوم بدعم النقش غير متزامن يستند إلى حدث

كيفية القيام بما يلي: تشغيل عملية في الخلفية

كيفية القيام بما يلي: تنفيذ النماذج التي تستخدم عملية الخلفية

المرجع

ProgressChangedEventArgs

BackgroundWorker

AsyncCompletedEventArgs

المبادئ

أفضل الممارسات لتطبيق حدث-إلى نقش غير متزامن

تحديد متى يتم تنفيذه نقش غير متزامن يستند إلى حدث

موارد أخرى

ذات مؤشرات ترابط متعددة البرمجة بالأحداث المستندة إلى نمط غير متزامن