مثال MSDN على التعامل مع استثناء من TPL - هل هذه حالة سباق؟

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

سؤال

أنا أنظر إلى مثال معالجة استثناء 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 () يكون الاستثناء المقترح لخيط الانضمام. يتم "تخزين" الاستثناء بشكل أساسي حتى يمكن اقتراحه مرة أخرى إلى مؤشر ترابط ينتظر التعليقات.

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