أفضل الممارسات لتطبيق حدث-إلى نقش غير متزامن
نقش غير متزامن يستند إلى حدث توفر لك طريقة فعالة لكشف سلوك غير المتزامن في فئات مع حدث المألوفة و تفويض دلالات. لتطبيق يستند إلى حدث غير متزامن نقش، فتحتاج إلى اتباع بعض متطلبات سلوكية معينة. تصف المقاطع التالية المتطلبات والإرشادات التي يجب وضعها في الاعتبار عند تطبيق فئة يتبع غير متزامن تستند إلى حدث نقش.
للحصول على نظرة عامة حول هذا الموضوع, راجع تطبيق حدث-إلى نقش غير متزامن.
The following قائمة shows the best practices discussed في this موضوع:
مطلوب Behavioral Guarantees
Completion
مكتمل حدث و EventArgs
Simultaneously Executing العمليات
Accessing نتائج
التقدم التقارير
IsBusy Implementation
الإلغاء
أخطاء و استثناءات
Threading و Contexts
إرشادات
مطلوب Behavioral Guarantees
If you implement the حدث-based نمط غير متزامن, you must provide a رقم of guarantees إلى ensure that your فئة will behave properly و clients of your فئة can rely تشغيل such سلوك.
Completion
دوماً invoke the MethodNameCompleted معالج الأحداث when you have successful completion, an خطأ, أو a cancellation. يجب أن لا تواجه التطبيقات على موقف بحيث تظل خاملة و الإكمال لم يحدث. تم استثناء واحد لهذه قاعدة إذا كان غير متزامن تشغيل نفسها تصميمه لكي يتم إكمال.
مكتمل حدث و EventArgs
For each separate MethodNameAsync method, apply the following design requirements:
قم بتعريف حدثاً MethodNameCompleted على نفس فئة كالأسلوب.
تعريف EventArgsالفئة و المفوض المرافق حدث MethodNameCompleted "مشتقة من AsyncCompletedEventArgsفئة. القيمة الافتراضية فئة يجب أن يكون الاسم من نموذج من MethodNameCompletedEventArgs.
التأكد من أن EventArgsالفئة هو الخاصة بقيم الإرجاع MethodName الطريقة. عندما تقوم باستخدام EventArgsفئة، يجب أن لا تتطلب المطورين إلى تحويل الناتج.
يظهر المثال تعليمات برمجية التالي بضاعة و تصميم التطبيق غير صالح لهذا المتطلب على التوالي.
[#C]
// Good design
private void Form1_MethodNameCompleted(object sender, xxxCompletedEventArgs e)
{
DemoType result = e.Result;
}
// Bad design
private void Form1_MethodNameCompleted(object sender, MethodNameCompletedEventArgs e)
{
DemoType result = (DemoType)(e.Result);
}
Simultaneously Executing العمليات
في الولاية اعتماد فئة invocations المتزامنة المتعددة، تمكين المطور لتعقب كل استدعاء بشكل منفصل بتعريف التحميل الزائد MethodNameAsync تأخذ معلمة الولاية valued على الكائن، أو المعرف المهمة، تسمى userSuppliedState. أن هذه معلمة دوماً يكون معلمة الأخيرة في توقيع الأسلوب MethodNameAsync .
إذا كان يعرف فئة التحميل الزائد MethodNameAsync تأخذ معلمة الولاية valued على الكائن أو المعرف مهمة، تأكد من في مقطع صوتي عمر تشغيل بهذا الالمعرف للمهمة، وتأكد من في توفيره مرة أخرى في في المعالج الإكمال. وتتوفر فئات مساعد إلى مساعدة. ل المزيد من المعلومات تشغيل إدارة التزامن، راجع الإرشادات التفصيلية: تنفيذ مكونات التي تعتمد حدث-إلى نقش غير متزامن.
الطريقة MethodNameAsync بدون معلمة حالة يقوم بتعريف الفئة، لا يعتمد invocations المتزامنة المتعددة، تأكد من أن أي محاولة إلى استدعاء من MethodNameAsync قبل له كتابي MethodNameAsync استدعاء raises المكتملة InvalidOperationException.
بشكل عام، أن لم raهوe استثناء إذا الطريقة MethodNameAsync بدون userSuppliedStateمعلمة هو استدعاء عدة مرة/مرات حيث توجد عدة العمليات الواضحة. أن تقوم بإصدار استثناء عند الخاص بك فئة بوضوح لا يمكن معالجة هذا الموقف، ولكن افترض أن المطورين معالجة هذه عمليات الاسترجاعات indistinguishable متعددة
Accessing نتائج
إذا حدث خطأ أثناء تنفيذ غير متزامن تشغيل، نتائج لا يجب أن يكون قابل للوصول. تأكد من أن الوصول إلى أي خاصية في AsyncCompletedEventArgsعند Errorهو لا nullraهوes الاستثناء المشار إليه بواسطة Error. AsyncCompletedEventArgsفئة يوفر RaiseExceptionIfNecessaryالأسلوب لهذا الغرض.
تأكد من أن أي محاولة للوصول إلى النتيجة يرفع InvalidOperationExceptionيفيد بأنه تم إلغاء تشغيل. استخدام AsyncCompletedEventArgs.RaiseExceptionIfNecessaryأسلوب إلى إجراء هذا التحقق.
التقدم التقارير
يعتمد التقدم التقارير، إذا كان ذلك ممكناً. ويتيح ذلك للمطورين لتوفير خبرة أفضل لمستخدم تطبيق عند استخدامهم للفصل الدراسي.
إذا قمت بتطبيق ProgressChanged/ MethodNameProgressChanged حدث ما، تأكد من وجود أية أحداث مثل مرفوع لمعينه غير متزامن العملية بعد مرفوع الحدث MethodNameCompleted تلك العملية.
إذا كان القياسي ProgressChangedEventArgsهو تعبئة، تأكد من أن ProgressPercentageدائماً يمكن تفسيره كنسبة مئوية. النسبة المئوية لا تحتاج إلى أن تكون دقيقة، ولكن فإنه يجب أن يمثل نسبة مئوية. إذا كان يجب أن يكون لديك تقرير قياس مدى التقدم شيئا غير ذلك من نسبة مئوية، اشتقاق فئة من ProgressChangedEventArgsالفئة واترك ProgressPercentageعند القيمة 0. تجنب استخدام قياس تقرير غير نسبة مئوية.
تأكد من أن ProgressChangedحدث مرفوع تشغيل مؤشر ترابط المناسبة وفي الوقت المناسب في دورة حياة تطبيق. للحصول على مزيد من المعلومات، راجع مقطع Threading و السياقات.
IsBusy Implementation
لا تعرض IsBusyخاصية إذا كان فئة يعتمد المتعددة المتزامنة invocations. على سبيل المثال، لا تعرض وكلاء الخدمة ويب ل XML IsBusyخاصية لأنها كانت دعم invocations المتزامنة العديد من الأساليب غير متزامنة.
IsBusyيجب إرجاع خاصية trueبعد يسمى MethodNameAsync الأسلوب وله تم تشغيل حدث قبل من MethodNameCompleted. وإلا فإنه يجب أن تعود false. BackgroundWorkerو WebClientمكونات أمثلة الفئات التي تكشف IsBusyخاصية.
الإلغاء
يدعم الإلغاء، إذا كان ذلك ممكناً. ويتيح ذلك للمطورين لتوفير خبرة أفضل لمستخدم تطبيق عند استخدامهم للفصل الدراسي.
في حالة من الإلغاء، تعيين Cancelledوضع علامة في AsyncCompletedEventArgsالكائن.
تأكد من أن أي محاولة للوصول إلى النتيجة يرفع InvalidOperationExceptionيفيد بأنه تم إلغاء تشغيل. استخدام AsyncCompletedEventArgs.RaiseExceptionIfNecessaryأسلوب إلى إجراء هذا التحقق.
تأكد من يقوم باستدعاء إلى أسلوب إلغاء دوماً بإرجاع بنجاح، ولن تقوم بإصدار استثناء. بشكل عام، يقوم عميل هو لا إعلام إلى ما إذا كانت عملية هو cancelable بشكل صحيح في أي وقت، و هو لا إعلام إلى ما إذا كان سبق هو نجاح إلغاء sued. على الرغم من ذلك، تطبيق سيتم دوماً إعطاء إعلام عند إلغاء نجاح، لأن تطبيق يأخذ جزء في حالة اكتمال.
Raهوe حدث MethodNameCompleted عند تشغيل هو إلغاؤها.
أخطاء و استثناءات
- التقاط أية استثناءات التي تحدث في غير متزامن تشغيل وتعيين القيمة AsyncCompletedEventArgs.Errorخاصية لهذا استثناء.
Threading و Contexts
للعملية الصحيحة للفصل الدراسي، فإنه هو الهامة التي يتم بها استدعاء معالجات الحدث الخاصة بالعميل تشغيل مؤشر ترابط الصحيح أو سياق للطراز تطبيق معين، بما في ذلك ASP.NETوتطبيقات Windows Forms. فئتين المساعد الهامة المتوفرة للتأكد من أن لديك غير متزامن فئة يتصرف بشكل صحيح ضمن أي نموذج تطبيق: AsyncOperation وAsyncOperationManager
AsyncOperationManagerتوفير أسلوب واحد،CreateOperation، التي تقوم بإرجاعAsyncOperation. استدعاء الخاص بك MethodNameAsync أسلوب CreateOperationويستخدم فئة يتم إرجاع AsyncOperationلتعقب العمر غير متزامن مهمة.
للإبلاغ عن التقدم والنتائج المتزايد الاكتمال إلى العميل، قم باستدعاء من Postو OperationCompletedالأساليب تشغيل AsyncOperation. AsyncOperationهو المسؤولة عن التنظيم والإرسال استدعاءات لمعالجات الأحداث الخاصة بالعميل إلى مؤشر ترابط المناسبة أو سياق.
ملاحظة |
---|
يمكن تجاوز هذه القواعد إذا قمت بوضوح للانتقال من سياسة لنموذج تطبيق، لكن لا تزال تستفيد من ميزات غير ذلك استخدام "نقش غير متزامن" يستند إلى حدث.على سبيل المثال، قد تحتاج فئة تعمل في Windows Forms إلى يتم تحرير مؤشر ترابط.يمكنك إنشاء clكـs مترابطة حرة كـ طويلاً كـ فهم مطوري قيود ضمنية.لا يزامن تطبيقات وحدة التحكم على التنفيذ Postالمكالمات.يمكن أن يسبب هذا ProgressChangedأحداث إلى يمكن رفع خارج الترتيب.إذا كنت ترغب إلى تم تسلسل تنفيذ Postتطبيق المكالمات، وتثبيت System.Threading.SynchronizationContextفئة. |
للحصول على مزيد من المعلومات حول استخدام AsyncOperationو AsyncOperationManagerلتمكين جهاز غير متزامن العمليات، راجع الإرشادات التفصيلية: تنفيذ مكونات التي تعتمد حدث-إلى نقش غير متزامن.
إرشادات
وبشكل مثالي، يجب أن يكون كل استدعاء أسلوب مستقل عن الآخرين. يجب تجنب ازدواج invocations مع موارد المشتركة. إذا كانت موارد إلى تكون مشتركة بين invocations، سوف تحتاج إلى توفر وسيلة مزامنة الصحيحة في التطبيق الخاص بك.
تصميمات يتطلب من العميل إلى تنفيذ المزامنة هي discouraged. على سبيل المثال، يمكنك جعل أسلوب كـ ynchronous يتلقى كائن ثابت عمومية كـ معلمة؛ المتزامن متعددة قد invocations مثل أسلوب يؤدي إلى تلف بيانات أو deadlocks.
إذا قمت بتطبيق أسلوب مع التحميل الزائد للاستدعاء بمضاعفات ( userStateفي توقيع)، بحاجة للفصل الدراسي إلى إدارة مجموعة من حالات مستخدم، أو معرفات المهام والمقابل معلّقة العمليات. يجب أن تكون هذه المجموعة محمية مع lockالمناطق، لأن إضافة invocations المتنوعة و إزالة userStateالكائنات في المجموعة.
خذ بعين الاعتبار إعادة استخدام CompletedEventArgsالفئات في المكان المناسب و feasible. في ترتيب هو الحالة، تسمية هو consهوtent بالأسلوب غير الاسم، ولأن معطى المفوض و EventArgsنوع لا ترتبط بأسلوب مفرد. ومع ذلك، فرض المطورين تحويل القيمة المستردة من خاصية في EventArgsهو مقبولة مطلقا.
إذا قمت بتأليف فئة مشتقة من Component، قم بتطبيق لا و يثّبت الخاص بك SynchronizationContextclass. التحكم في نماذج تطبيق، وليس مكونات، SynchronizationContextالتي هو المستخدمة.
عند استخدام متعدد العمليات من أي نوع، من المحتمل أن تعريض نفسك إلى هام جداً و المعقدة من الأخطاء. قبل تطبيق أية حلول أن يستخدم متعدد العمليات، راجع مدارة مؤشر الترابط التشعبي أفضل الممارسات.
راجع أيضًا:
المهام
كيفية القيام بما يلي: استخدم المكونات التي تقوم بدعم النقش غير متزامن يستند إلى حدث
الإرشادات التفصيلية: تنفيذ مكونات التي تعتمد حدث-إلى نقش غير متزامن
المرجع
المبادئ
تحديد متى يتم تنفيذه نقش غير متزامن يستند إلى حدث
أفضل الممارسات لتطبيق حدث-إلى نقش غير متزامن
موارد أخرى
ذات مؤشرات ترابط متعددة البرمجة بالأحداث المستندة إلى نمط غير متزامن