同期コードを実行するための非同期アクションを使用してください
-
09-12-2019 - |
質問
私は、シンプルなビューと非同期パスを返す2つのパス、および非同期パスを持ち、それからビューを返す検索アクションがあります。どちらもリクエストを受け取るので、それらは同じ行動の一部です。
問題は、アクション "localhost:xxxx / home / search"にアクセスすると、そのページは無限にロードします。フィドラーを使用して、要求が返されないことがわかります。デバッグしました。最後のコード行になりますが、再び要求は完了しません。
次のようにREPROを簡略化しました:
public async Task<ActionResult> Search()
{
return View();
}
.
vs11は、コードが待っていなければ同期して実行されることを私に警告します。
この作品は?それとも私はここに何か他の何かをする必要がありますか?
編集
これは、.NET 4.5をターゲットにするMVC 4です。
編集2
コードで物事をよく見る人のために、これが私が非同期アクションで同期が必要な理由です:
.public async Task<ActionResult> Search(string query = null)
{
if (string.IsNullOrWhiteSpace(query))
return View(new SearchViewModel()); // never loads
var model = await _someService.SearchAsync(query);
return View(model); // loads
}
解決
これはベータ版の既知のバグです。 stephen toubを引用する:
短い答えは、.NET 4.5 BetaのASP.NET MVCに既知のバグがあるため、非同期方式が同期的に完了したときにこの問題が発生します。修正が可能になるまで、簡単な回避策は「Task.yield()を待って」を追加することです。非同期メソッドの最初の行として、非同期的に完了するように強制します。これが正しく機能するためには、.NET 4.5でASP.NETによって提供された新しいSynchronizationContextを使用していることを確認する必要があります。これは、行を確保することを意味します。
. 設定ファイルのAppSettingsセクションの<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />