مثال MSDN على التعامل مع استثناء من TPL - هل هذه حالة سباق؟
-
27-09-2019 - |
سؤال
أنا أنظر إلى مثال معالجة استثناء TPL من msdn @
http://msdn.microsoft.com/en-us/library/dd537614(v=vs.100).aspx
الشكل الأساسي للرمز هو:
Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); });
try
{
task1.Wait();
}
catch (AggregateException ae)
{
throw ae.Flatten();
}
سؤالي هو: هل هذه حالة سباق؟ ماذا يحدث إذا كان Task1 يلقي قبل تنفيذ المحاولة؟ هل أفتقد شيئًا يوقف هذا العرق؟
لا ينبغي أن تكتب هكذا بدلاً من ذلك:
try
{
Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); });
task1.Wait();
}
catch (AggregateException ae)
{
throw ae.Flatten();
}
المحلول
لا ، المثال الأول صالح تمامًا.
عندما يتم إثارة الاستثناء في المهمة ، يتم لفها في مجموعة كبيرة. فقط عندما ينضم مؤشر ترابط آخر إلى المهمة ، في هذا المثال عن طريق استدعاء Task1.wait () يكون الاستثناء المقترح لخيط الانضمام. يتم "تخزين" الاستثناء بشكل أساسي حتى يمكن اقتراحه مرة أخرى إلى مؤشر ترابط ينتظر التعليقات.
لا تنتمي إلى StackOverflow