Triệu chứng
.NET Framework 4.6 vào enum gõ giá trị mới, RunContinuationsAsynchronously, TaskCompletionSource và TaskCreationOptions enums. Giá trị này áp dụng tác vụ để chạy không đồng bộ và điều này giúp tránh trường hợp gián đoạn. Tuy nhiên, sự cố đã được phát hiện, đối với một số loại cụ thể continuations (trong đặc biệt khi Task.WhenAll, Task.WhenAnyhoặc TaskExtensions.Unwrap tạo các continuations), tuỳ chọn sẽ bị bỏ qua. Do đó, continuations có thể vẫn chạy đồng bộ.
Mẫu sau hiển thị các vấn đề. Nếu giá trị RunContinuationsAsynchronously đã hoạt động bình thường, hai luồng ID được in ra không bao giờ sẽ giống nhau, vì tiếp tục sẽ luôn được sắp xếp vào các chủ đề khác nhau.
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();
}
}
Giải pháp
Hiện không có giải pháp cho vấn đề này. Microsoft .NET Framework nhóm đang làm việc trên một giải pháp bao gồm trong bản Cập Nhật trong tương lai.