Συμπτώματα
Το 4.6 του .NET Framework προστεθεί μια νέα τιμή τύπου απαρίθμησης, RunContinuationsAsynchronously, το 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 λειτουργεί με μια λύση για να συμπεριλάβετε σε μια μελλοντική ενημερωμένη έκδοση.