Belirtiler
.NET Framework 4.6 yeni bir enum türü değeri, RunContinuationsAsynchronously, TaskCompletionSource ve TaskCreationOptions numaralamalar için eklendi. Bu değer görevlerin zaman uyumsuz olarak çalışmasını zorlar ve bu çıkmaz durumları önlemek için yardımcı olur. Bununla birlikte, bir sorun bulundu nerede, devamlılığını (özellikle) Task.WhenAll, Task.WhenAnyveya TaskExtensions.Unwrap devamlılığını oluşturduğunuzda, belirli bazı türleri için seçeneği yok sayılır. Bu nedenle, devamlılığını yine eş zamanlı olarak çalışabilir.
Aşağıdaki örnek bir sorunu gösterir. RunContinuationsAsynchronously değeri doğru olarak çalışıp, devamı her zaman farklı iş parçacıkları zamanlanması çünkü iki iş parçacığı Yazdırılan çıkış kimlikleri asla aynı olacaktır.
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();
}
}
Çözüm
Şu anda bu soruna yönelik geçici çözüm yoktur. Microsoft .NET Framework takım, gelecekteki bir güncelleştirme dahil etmek için bir çözüm üzerinde çalışmaktadır.