非同期PartialViewにより、「HttpServerUtility.Executeblocked…」例外が発生します


85

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は、非同期操作が完了するのを待っている間にブロックされました。

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

回答:


97

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

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

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

MVC6の詳細については、http: //www.asp.net/vnext/overview/aspnet-vnext/overviewをご覧ください。

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


601リンクはもう有効ではありません
Serge

6

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

ここで私の完全な質問を参照してください


3
(この投稿は、質問に対する質の高い回答を提供していないようです。回答を編集するか、質問へのコメントとして投稿してください)。
sɐunıɔןɐqɐp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.