อาการ
4.6 กรอบงาน.NET ที่เพิ่ม enum ชนิดค่าใหม่RunContinuationsAsynchronously, enums TaskCompletionSourceและTaskCreationOptions ค่านี้เป็นบังคับงานให้ทำงานแบบอะซิงโครนัส และซึ่งช่วยหลีกเลี่ยงสถานการณ์การชะงักงัน อย่างไรก็ตาม พบประเด็นที่ สำหรับบางชนิดที่เฉพาะเจาะจงของ continuations (ในเฉพาะเมื่อTask.WhenAll, Task.WhenAnyหรือTaskExtensions.Unwrapสร้างแบบ continuations), ตัวเลือกจะถูกละเว้นไป ดังนั้น continuations อาจยังคงทำงานพร้อมกัน
ตัวอย่างต่อไปนี้แสดงปัญหา ถ้าค่าRunContinuationsAsynchronouslyได้ทำงานอย่างถูกต้อง เธรดสองรหัสที่พิมพ์ออกไปจะไม่เหมือน เนื่องจากจะสามารถจัดกำหนดการการที่ต่อเนื่องบนเธรดอื่นเสมอกัน
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 ไม่มีปัญหาในการแก้ไขปัญหาการรวมไว้ในการปรับปรุงในอนาคต