Gejala
.NET Framework 4.6 ditambahkan enum Ketik nilai yang baru, RunContinuationsAsynchronously, enums TaskCompletionSource dan TaskCreationOptions . Nilai ini memaksa tugas untuk menjalankan asinkron, dan ini akan membantu mencegah kemogokan situasi. Namun, masalah telah ditemukan di mana, untuk beberapa jenis khusus continuations (khususnya ketika Task.WhenAll, Task.WhenAnyatau TaskExtensions.Unwrap membuat continuations), opsi diabaikan. Oleh karena itu, continuations mungkin masih berjalan serentak.
Contoh berikut ini menunjukkan masalah tersebut. Jika nilai RunContinuationsAsynchronously telah berfungsi dengan baik, thread dua id yang akan dicetak tidak akan sama, karena kelanjutan akan dijadwalkan ke kain yang berbeda. 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(); } }Pemecahan masalah
Saat ini tidak ada penyelesaian untuk masalah ini. Microsoft .NET Framework tim bekerja pada solusi yang termasuk dalam pembaruan masa mendatang.