私は非同期を使用してデータベースから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は、非同期操作の完了を待機中にブロックされました。
なぜこのエラーが発生するのですか?うまくいかない?
子アクションは同期的に呼び出す必要があります。 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
注:この回答は形式的なものであるため、質問に回答済みのマークを付けることができます
この問題の回避策は、MVCの必要に応じてメソッドを同期化し、SynchronizationContextをクリアし、asyncメソッドを呼び出して結果を待ち、コンテキストを復元することです。
私のフルアスワーを参照してください こちら