Applies To.NET Framework 4.6.1

現象

.NET Framework の 4.6 では、 TaskCompletionSource 、 TaskCreationOptions列挙型に、新しい列挙型の値、 RunContinuationsAsynchronouslyが追加されます。デッドロックを回避できるので、この値を強制的に非同期的に実行するタスク。ただし、問題が検出された場所に、(特定のTask.WhenAll、 Task.WhenAny、またはTaskExtensions.Unwrapは、継続を作成するとき) に継続のうちの特定の種類がいくつか、オプションは無視されます。したがって、継続は同期的に実行も可能性があります。次の例は、問題を示しています。RunContinuationsAsynchronously値が正しく機能している場合、2 つのスレッド Id が出力されることはありません同じになります、別のスレッド上に継続をスケジュールするは常にあるためです。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 チームは、今後のアップデートでは、解決策に取り組んでいます。

ヘルプを表示

その他のオプションが必要ですか?

サブスクリプションの特典の参照、トレーニング コースの閲覧、デバイスのセキュリティ保護方法などについて説明します。

コミュニティは、質問をしたり質問の答えを得たり、フィードバックを提供したり、豊富な知識を持つ専門家の意見を聞いたりするのに役立ちます。