同期コードを実行するための非同期アクションを使用してください

StackOverflow https://stackoverflow.com//questions/9627329

  •  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を使用していることを確認する必要があります。これは、行を確保することを意味します。

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
. 設定ファイルのAppSettingsセクションの

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top