メイン コンテンツへスキップ
サポート
Microsoft アカウントでサインイン
サインインまたはアカウントを作成してください。
こんにちは、
別のアカウントを選択してください。
複数のアカウントがあります
サインインに使用するアカウントを選択してください。

現象

.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 チームは、今後のアップデートでは、解決策に取り組んでいます。


ヘルプを表示

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

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

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

この情報は役に立ちましたか?

言語の品質にどの程度満足していますか?
どのような要因がお客様の操作性に影響しましたか?
[送信] を押すと、Microsoft の製品とサービスの改善にフィードバックが使用されます。 IT 管理者はこのデータを収集できます。 プライバシーに関する声明。

フィードバックをいただき、ありがとうございます。

×