Triệu chứng
.NET Framework 4.6 đã thêm một giá trị kiểu enum mới, RunContinuationsAsynchronously, vào taskCompletionSource và TaskCreationOptions liệt kê. Giá trị này buộc các nhiệm vụ chạy không đồng bộ và điều này giúp tránh các tình huống đình trệ. Tuy nhiên, một sự cố đã được phát hiện trong đó, đối với một số loại phần tiếp tục cụ thể (đặc biệt là khi Task.WhenAll, Task.WhenAny hoặc TaskExtensions.Unwrap tạo phần tiếp tục), tùy chọn sẽ bị bỏ qua. Vì vậy, continuations vẫn có thể chạy đồng bộ.
Mẫu sau đây cho thấy sự cố. Nếu giá trị RunContinuationsAsynchronously đã hoạt động đúng, hai luồng ID được in ra sẽ không bao giờ giống nhau, bởi vì tiếp tục sẽ luôn luôn được lên lịch vào các chủ đề khác nhau.
sử dụng Hệ thống;
sử dụng System.Threading;
bằng cách sử dụng System.Threading.Tasks;
chương trình lớp
{
tĩnh không có hiệu lực Main()
{
var mres = new ManualResetEventSlim();
Console.WriteLine(Environment.CurrentManagedThreadId);
var tcs = mới TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
var t = Task.WhenAll(tcs. Nhiệm vụ);
t.ContinueWith(delegate
{
Console.WriteLine(Environment.CurrentManagedThreadId);
bà. Set();
}, TaskContinuationOptions.ExecuteSynchronously);
Tcs. SetResult(true);
bà. Wait();
}
}
Giải pháp
Hiện không có giải pháp thay thế nào cho sự cố này. Nhóm Microsoft .NET Framework đang nỗ lực tìm giải pháp để đưa vào bản cập nhật trong tương lai.