RunContinuationsAsynchronously が継続を非同期的に実行されません。

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:3118695
現象
.NET Framework の 4.6 では、 TaskCompletionSourceTaskCreationOptions列挙型に、新しい列挙型の値、 RunContinuationsAsynchronouslyが追加されます。デッドロックを回避できるので、この値を強制的に非同期的に実行するタスク。ただし、問題が検出された場所に、(特定のTask.WhenAllTask.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();    }}

解決方法
この問題の回避策は現在ありません。マイクロソフトに.NET Framework チームは、今後のアップデートでは、解決策に取り組んでいます。


プロパティ

文書番号:3118695 - 最終更新日: 11/25/2015 03:48:00 - リビジョン: 1.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbexpertiseadvanced kbtshoot kbmt KB3118695 KbMtja
フィードバック