سؤال

كنت جديدا على async-await الطريقة في C# 5.0, ولدي بعض الأسئلة في ذهني

  1. ما هي أفضل طريقة للهروب من async طريقة إذا فشلت وسيطة الإدخال أو الاختيار فارغة?

  2. ما هو التدفق المنطقي لاستخدام return; في مهمة async طريقة (في بعض الظروف ، أصبح حلقة لا نهائية)?

  3. هو CancellationToken أو Task.Yield تناسب أفضل في هذا السيناريو?

public Func<AzureBlobInfo, string, Task> UploadSuccessCallBackAsync { get; set; }

private async Task OnUploadSuccessAsync(AzureBlobInfo info)
{
    if (this.UploadSuccessCallBackAsync == null)
    {
        return;
    }

    var transactionType = this.FormData.Get("transactionType");
    if (string.IsNullOrEmpty(transactionType))
    {
        transactionType = "unknown";
    }

    await this.UploadSuccessCallBackAsync(info, transactionType);
}
هل كانت مفيدة؟

المحلول

أفضل طريقة "تفشل عند بعض المشكلة" IMHO أن رمي المناسبة استثناء ، ولكن بالتأكيد يمكنك فقط استخدام return; إذا كنت تفضل تجنب استثناءات.

وهذا خلق الانتهاء/معيبا المهمة التي تم الانتهاء بشكل متزامن ، لذلك المتصل باستخدام await سوف تحصل على الانتهاء من المهمة و الاستمرار في استخدام نفس الموضوع.


  • CancellationToken يسمح المتصل إلى إلغاء العملية ، وهي ليست حالة كنت تصف.

  • Task.Yield لا إنهاء أي عملية ، فإنه فقط تمكن مهام أخرى لتشغيل لبعض الوقت ثم يعيد جدولة نفسها في وقت لاحق.

نصائح أخرى

يمكنك العودة بأمان من طريقة ASYNC في أي لحظة.في حالتك (الطريقة التي تعيد مهمة مهمة) سيقوم المحول البرمجي بإنشاء مهمة إنهاء، لذلك ستستمر أي متصل في انتظار وظيفتك.

عند رمي استثناء من async الطريقة التي يتم التقاطها في المهمة حتى لا يتم إلقاؤها حتى يتم ملاحظة المهمة عن طريق الاتصال Task.Wait(), Task.Result, ، في انتظار المهمة أو الوصول إلى Exceptions خاصية المهمة.

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

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