إنهاء أو الخروج ج # طريقة غير متزامن مع "العودة"
-
21-12-2019 - |
سؤال
كنت جديدا على async-await
الطريقة في C# 5.0
, ولدي بعض الأسئلة في ذهني
ما هي أفضل طريقة للهروب من
async
طريقة إذا فشلت وسيطة الإدخال أو الاختيار فارغة?ما هو التدفق المنطقي لاستخدام
return;
في مهمةasync
طريقة (في بعض الظروف ، أصبح حلقة لا نهائية)?هو
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
.انظر هذا أسئلة الإجابة عن طريق ستيفن كليري على سبيل المثال.وبهذه الطريقة سيتم طرح استثناء وسيطة الإدخال على الفور خارج المهمة التي تم إرجاعها بواسطة الطريقة.