الأعراض
4.6 إطار عمل.NET إضافة قيمة نوع تعداد جديد، رونكونتينواتيونساسينتشرونوسلي، التعدادات تاسككومبليتيونسورسي و تاسككريتيونوبشنز . تفرض هذه القيمة المهام ليتم تشغيلها بشكل متزامن، وهذا يساعد على تجنب المواقف حالة توقف تام. ومع ذلك، تم اكتشاف مشكلة حيث يتم فيه تجاهل الخيار لبعض أنواع معينة من الاستمرار (وبخاصة عند الاستمرار في إنشاء Task.WhenAllأو Task.WhenAnyأو TaskExtensions.Unwrap ). لذلك، قد تعمل الاستمرار لا يزال بشكل متزامن.
يبين النموذج التالي المشكلة. إذا القيمة رونكونتينواتيونساسينتشرونوسلي تعمل بشكل صحيح، مؤشر الترابط بين معرفات يتم طباعة قد تكون هي نفسها، نظراً للاستمرار دائماً سيتقرر على مؤشرات ترابط مختلفة.
using System;using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
var mres = new ManualResetEventSlim();
Console.WriteLine(Environment.CurrentManagedThreadId);
var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
var t = Task.WhenAll(tcs.Task);
t.ContinueWith(delegate
{
Console.WriteLine(Environment.CurrentManagedThreadId);
mres.Set();
}, TaskContinuationOptions.ExecuteSynchronously);
tcs.SetResult(true);
mres.Wait();
}
}
الحل
لا يوجد حاليا أي حل هذه المشكلة. يعمل فريق Microsoft.NET Framework على إيجاد حل لتضمين في تحديثات مستقبلية.