C # لديها وظيفة Async استدعاء وظيفة متزامن أو وظيفة متزامن دعوة وظيفة ASYNC

StackOverflow https://stackoverflow.com//questions/11674073

سؤال

أنا أكتب مكتبة C # .NET 4.5 للقيام بعمليات قاعدة بيانات SQL المشتركة (النسخ الاحتياطي، واستعادة البرنامج النصي، وما إلى ذلك). أريد أن أحصل على وظائف متزامنة وغير متزامنة لكل عملية، حيث سيتم استخدام هذه المكتبة من خلال تطبيقات وحدة التحكم و GUI، لكنني لا أريد تكرار رمز في كل مكان. لذلك كما أراها، لدي خياران:

  1. اكتب الرمز الذي يقوم بالعمل في وظيفة متزامنة، ثم لفه فقط في مهمة لوظيفة ASYNC، مثل ذلك: giveacodicetagpre

  2. اكتب الرمز الذي يقوم بالعمل في وظيفة غير متزامنة، واتصل به من وظيفة متزامنة باستخدام. انتظر (): giveacodicetagpre

    هو خيار واحد أفضل من الآخر؟ هي واحدة أفضل الممارسات؟ أم أن هناك أي بدائل أخرى (أفضل)؟

    أعرف أن تحذير واحد لاستخدام. انتظر () هو أن جميع البيانات في انتظار وظيفة ASYNC تضطر إلى استخدام .configureawait (FALSE) لتجنب الجمود ( كما تمت مناقشته هنا )، ولكن منذ أن أكتب مكتبة لن تحتاج أبدا إلى الوصول إلى UI أو Webcontext أنا آمن للقيام بذلك.

    سألاحظ أيضا أن مكتبة SQL تحتوي عادة على كل من وظائف متزامنة و ASYNC التي يمكن استخدامها، لذلك إذا قمت بالعمل في وظيفة المزامنة، فسأتصل بوظيفة المزامنة، وإذا قمت بعمل العمل في ASYNC وظيفة، أود أن أسمي وظيفة ASYNC الخاصة بهم.

    أفكار / اقتراحات موضع تقدير.

    - تحرير: لقد قمت أيضا بنشر هذا السؤال على منتديات MSDN هنا لمحاولة الحصول على استجابة MS رسمية -

هل كانت مفيدة؟

المحلول

أريد أن أحصل على كل من وظائف متزامنة وغير متزامنة لكل عملية، حيث سيتم استخدام هذه المكتبة من قبل كل من تطبيقات وحدة التحكم و GUI، لكنني لا أريد تكرار رمز في كل مكان.

أفضل إجابة هي: لا.

ستيفن Toub لديه اثنين من المشاركات المدونة ممتازة في هذا الموضوع:

نصائح أخرى

كان لدي موقف مماثل حيث احتاج بعض التطبيقات إلى تحميل البيانات بشكل متزامن وغيرها ASYC.قررت إنشاء واجهة تسمى DataLoader: giveacodicetagpre.

رد الاتصال المحدد هو مجرد مندوب بسيط يأخذ في قائمة المشاريع التي تم إرجاعها: giveacodicetagpre.

الآن، جمال ذلك هو أنه يمكنك العمل مع الواجهة دون معرفة ما إذا كنت تتعامل مع مزامنة أو ASYNC.

يتم إنشاء ثلاث فئات: قاعدة واحدة، مزامنة واحدة، واحدة ASYNC: giveacodicetagpre.

الآن، في التطبيق الخاص بك، يمكنك أن تقرر كيف تريد تحميل البيانات ... يمكن أن يتم حقن ذلك من خلال حاوية IOC، ولكنه مشفرة بجد لأغراض تجريبية: giveacodicetagpre.

الآن، يبدو رمز الاتصال الخاص بك هو نفسه وليس أكثر الأهمية ما إذا كان Async أو المزامنة: giveacodicetagpre.

يمكنني استخدام هذا بانتظام للاختبار الوحدات (المزامنة)، تطبيقات WPF (ASYNC) وتطبيقات وحدة التحكم (SYNC).

لا يبدو أن هناك نقطة واحدة لتحديد طريقة ASYNC دون استخدام انتظار. بمناسبة ذلك لأن ASYNC لا يجعلها غير متزامنة، فإنه يسمح لك باستخدام Awaits (يتم تنفيذ التعليمات البرمجية في الانتظار هو ما يحدث بشكل غير متزامن، ثم سيتم أيضا إجراء ما تبقى من طريقة ASYNC بشكل غير متزامن) في نص الطريقة: < / ص>

عادة، تحتوي الطريقة المعدلة عليها الكلمة الأساسية ASYNC تعبير أو عبارة واحدة على الأقل في انتظارها. تعمل الطريقة بشكل متزامن حتى تصل إلى أول تعبير في انتظار، عند إكمال المشاركة حتى تكتمل المهمة المنتظيرة. في غضون ذلك، يتم إرجاع عنصر التحكم إلى المتصل للطريقة. إذا كانت الطريقة لا تحتوي على تعبير أو عبارة في انتظار، فإنه ينفذ بشكل متزامن. ينبهك تحذير مترجم إلى أي أساليب ASYNC لا تحتوي على انتظار لأن هذا الموقف قد يشير إلى وجود خطأ. لمزيد من المعلومات، راجع تحذير مترجم CS4014.

من: ASYNC / ص>

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top