web-dev-qa-db-ja.com

非同期PartialViewにより「HttpServerUtility.Execute blocked ...」例外が発生する

私は非同期を使用してデータベースからIEnumerable<Post>を取得しようとする部分的なビューを持っています...

方法

public static class PostService
{
    public static int PostsPerPage = 50;

    public static async Task<IEnumerable<Post>> GetRecentAsync(int page = 0)
    {
        return await entityFrameworkDbContext.Posts
            .ToListAsync();
    }
}

PartialView

public async Task<ActionResult> Recent(int page = 0)
{
    return PartialView(await PostService.GetRecentAsync(page));
}

そして、私はそれを呼び出そうとすると

@Html.Action("Recent", "Post")

次の例外が発生します

非同期操作の完了を待機中にHttpServerUtility.Executeがブロックされました。

説明:現在のWeb要求の実行中に未処理の例外が発生しました。エラーの詳細およびコードのどこで発生したかについては、スタックトレースを確認してください。

例外の詳細:System.InvalidOperationException:HttpServerUtility.Executeは、非同期操作の完了を待機中にブロックされました。

なぜこのエラーが発生するのですか?うまくいかない?

77
BrunoLM

子アクションは同期的に呼び出す必要があります。 Issue 601 また、この機能を許可する現在のMVCライブラリへの最近の更新についても知りません。

Issue 601に関するコメントは、この機能がMVC vNextに追加されることを示唆しています。 MVC6。子アクションは、次のようにビューから非同期に呼び出すことができるViewComponentに置き換えられるようです。完全な例 here および here

<div>
@await Component.InvokeAsync("YourComponent")
</div>

MVC6の詳細については、 http://www.asp.net/vnext/overview/aspnet-vnext/overview

注:この回答は形式的なものであるため、質問に回答済みのマークを付けることができます

89
Xenolightning

この問題の回避策は、MVCの必要に応じてメソッドを同期化し、SynchronizationContextをクリアし、asyncメソッドを呼び出して結果を待ち、コンテキストを復元することです。

私のフルアスワーを参照してください こちら

2
Herre Kuijpers