معالجة الإستثناءات في البرمجة الغير متزامنة

31 ديسمبر 2016     408 مشاهدة    2 تعليق
تم النشر في #Asynchronous  #C# 

سنتطرق في مقالتنا اليوم على كيفية معالجة الإستثنات في البرمجة الغير متزامنة. كما هو معروف أن عملية سير البرنامج في البرمجة الغير متزامنة تختلف عن نظيرتها وهي البرمجة المتزامنة, طبعاً موضوع البرمجة المتزامنة , وماهي؟ وكيف تختلف عن البرمجة المتزامنة؟ خارج نطاق موضوع اليوم, لذا أتمنى من الشخص الذي ليس له دراية بالبرمجة الغير متزامنة أن يقرأ عنها ولو الشيء اليسير من ثم يكمل مقالة اليوم.

فالأول سنقوم بكتابة دالة غير متزامنة ونقذف فيها إستثناء ليتسنى لنا إستخدامها لاحقاً:

public async Task<List<string>> GetNames()
{
    await Task.Delay(2000);
    throw new NotImplementedException("The method is not implemented.");
}

طبعاً وكما نلاحظ سابقاً الدالة تنتظر ثانيتين ثم تقوم بقذف الإستثناء NotImpementedException وكذلك تم إستخدام الكلمتين المحجوزتين async و await, طبعاً أكيد ستعرفوا سبب وجودهم.

الآن دعونا نقوم بإستدعاء الدالة السابقة على النحو التالي:

private void button1_Click(object sender, EventArgs e)
{
    var names = GetAll();
}
private void button1_Click(object sender, EventArgs e)
{
    Task<List<string>> namesTask = GetAll();
    namesTask.ContinueWith(t =>
    {
        List<string> names = t.Result;
        MessageBox.Show($"There are {names.Count} names.");
    },
    TaskContinuationOptions.OnlyOnRanToCompletion);
}

طبعاً عند تنفيذك للإجرائين السابقين لن يحدث أي شيء!! ولن يقوم البرنامج بقذف الإستناء أعلاه!!

وبالتأكيد ستتسأل .. لماذا؟!!

ففي الحالة الأولى لم يتم إخبار الإجراء أن يقوم بتنفيذ الدالة GetNames وإكمال التنفيذ لحين أن تقوم الدالة بإرجاع النتجة. أما في الحالة الثانية فإنه تم إخبار البرنامج بالإستمرار بطباعة عدد الأسماء ولكن إذا كان الخيار TaskContinuationOptions.OnlyOnRanToCompletion, وهذا أكيد لن يتحقق لأن الدالة GetNames لم يتكمل تنفيذها بشكل صحيح.

فما الحل؟!!

طبعاً سنقوم بمعالجة الإستثناء السابق بطريقتين:

معالجة الإستثناء بإستخدام الـ Task

ببساطه يمكن إصطياد الإستثناء بإستخدام الخيار TaskContinuationOptions.OnlyOnFaulted على النحو التالي:

private void button1_Click(object sender, EventArgs e)
{
    Task<List<string>> namesTask = GetAll();
    namesTask.ContinueWith(t =>
    {
        var ex = t.Exception.InnerException;
        MessageBox.Show(ex.Message);
    },
    TaskContinuationOptions.OnlyOnFaulted);
}

طبعاً الخيار  TaskContinuationOptions.OnlyOnFaulted يسمح بالإستمرار إن حصل خطأ ما أثناء تنفيذ الـ Task, وبعدها تم الوصول إلى الكائن الذي يحتوى على معلومات الإستثناء وذلك من خلال الخاصية Exception.InnerException.

معالجة الإستثناء بإستخدام الـ await

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

private async void button1_Click(object sender, EventArgs e)
{
    try
    {
        List<string> names = await GetAll();
        MessageBox.Show($"There are {names.Count} names.");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

فبإضافة الكلمة await قبل إستدعاء الدالة الغير متزامنة ووضع الكلمة async في الإجراء الذي يقوم بإستدعائها, أصبح إستخدام الـ try .. catch هو الحل الأسهل لمعالجة الإستثناءات, مثل ماهو الحال في البرمجة المتزامنة.

قد يتسأل البعض لماذا لا نضع الكلمة await قبل إستدعاء أي دالة غير متزامنه, ولا داعي لإستخدام خيار المعالجة بإستخدام ال، Task نهائياً, قد أوافقك الرأي نوعاً ما, ولكن أعلم قد تصادفك أماكن تمنعك من إستخدام الـ await داخل الإجراء وأحدها داخل الإجراء Main الذي قد يغفل عنه الكثير.

تويتر فيسبوك قوقل + لينكد إن


2 تعليق

Agonnalislal (23/08/2017 03:10:54 ص)

Others is capable of a harder erection but cannot maintain it during sexual intercourse. Once you discover the top natural cures, you are able to once more have full control over your sexual pleasures.

Https://Www.Viagrapascherfr.Com/Prix-Viagra-Generique-France/ (22/09/2017 05:04:31 م)

The results you use by doing these Natural Male Enhancement Exercises are permanent and therefore the
ratio of men who choose increasing their manhood naturally is increasing day by day.
Various natural oils and lotions can also be found on the market which
will help increase your sexual prowess significantly.
Actually, usually the one prescribed depends on several
factors, including health, allergies of antibiotic,
and types of prostatitis, symptoms, and the
serious level.


اكتب تعليقك