web-dev-qa-db-ja.com

「UseTaskFriendlySynchronizationContext」の意味は何ですか?

Asp.net 4.5に新しいアプリ設定があります

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

このようなコードはasp.net 4.0で実行できます

protected void Button1_Click(object sender, EventArgs e)
{
    CallAysnc();
}

public void CallAysnc()
{
    AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(Guid.NewGuid().ToString());

    WebClient client = new WebClient();
    client.DownloadStringCompleted += (object sender, DownloadStringCompletedEventArgs e) =>
    {
        asyncOp.PostOperationCompleted(CallCompleted, e.Result);
    };
    client.DownloadStringAsync(new Uri("http://www.google.com"));
}

private void CallCompleted(object args)
{
    Response.Write(args.ToString());
}

しかし、asp.net 4.5では機能せず、新しいappsettingを削除すると、再び機能します!

「UseTaskFriendlySynchronizationContext」の意味は何ですか?

64
Dozer

UseTaskFriendlySynchronizationContextについては、 Microsoftフォーラム から:

これにより、必要に応じてスレッドをThreadPoolに返すなど、非同期操作を開始するためのCLR規則に従うまったく新しい非同期パイプラインを使用するようにASP.NETに指示します。 ASP.NET 4.0以前は、CLRガイドラインに反する独自の規則に従っており、スイッチが有効になっていない場合、非同期メソッドの実行はvery簡単です同期的に、要求をデッドロックするか、そうでなければ期待どおりに動作しません。

また、AsyncOperationManagerはデスクトップアプリケーションを対象としています。 ASP.NETアプリの場合は、RegisterAsyncTaskを使用して<%@ Page Async="true"詳細はこちらを参照

新しいc#キーワードを使用すると、例は次のようになります。

protected void Button1_Click(object sender, EventArgs e)
{
    RegisterAsyncTask(new PageAsyncTask(CallAysnc));
}

private async Task CallAysnc()
{
    var res = await new WebClient().DownloadStringTaskAsync("http://www.google.com");
    Response.Write(res);
}

目的はリリースごとに以下をサポートすることですが、ベータ版では現在サポートされていません。

protected async void Button1_Click(object sender, EventArgs e)
{
    var res = await new WebClient().DownloadStringTaskAsync("http://www.google.com");
    Response.Write(res);
}
69
Michael

詳細については、ASP.NET 4.5.1から引用 appSettingsのドキュメント MSDN

aspnet:UseTaskFriendlySynchronizationContext

ASP.NET 4.5の非同期コードパスの動作を指定します。

...

このキー値がfalse [デフォルト]に設定されている場合、ASP.NET 4.5の非同期コードパスはASP.NET 4.0の場合と同様に動作します。このキー値がtrueに設定されている場合、ASP.NET 4.5は、タスクを返すAPI用に最適化されたコードパスを使用します。この互換性スイッチの設定は、WebSockets対応アプリケーション、Webフォームページでのタスクベースの非同期の使用、およびその他の特定の非同期動作に必須です。

10
urig