2

では、あらすじを…

MVC 4 アプリのマスター レイアウト ページがあり、動的な情報があり、その情報を取得するには特定のドメイン エンティティに厳密に型指定する必要があります。ファイルをきれいに保つために、入力されたフィールドを部分ビューに抽出しました。

必要なエンティティを取得してパーシャルのビューモデルにマップするために、 を返すアクションを持つ LayoutController がありますTask<PartialViewResult>。このアクションは、サービス レイヤーを使用しasyncて Web API プロジェクトを呼び出しawait、エンティティを呼び出します。そのエンティティをビューモデルにマッサージしてから返しますPartialView("_LayoutPartial", viewModel).

_Layout ページ内から、パーシャルは次の方法で呼び出されます。

@{Html.RenderAction("LayoutInfo", "Layout", new { /*entity primary key*/ });}

コードをステップ実行したところ、実際に正しいエンティティが返されましたが、部分ビュー タスクを返した後、次のエラーが表示されたお気に入りのサーバー エラー ページが表示されました。

HttpServerUtility.Execute blocked while waiting for an asynchronous operation to complete.

私はいくつかのグーグル検索とSO検索を行いましたが、これが実際に何を意味するのかわかりません。私はこれを正しく考えていますか?

4

1 に答える 1

2

このエラー メッセージは、同期メソッド内から非同期メソッドを呼び出そうとしている (そして待っている!) ことを意味します。特定のケースでは、同期メソッドは HtmlHelper.RenderAction であり、非同期メソッドはタスクを返すアクション メソッドです。エラーが発生する理由は、非同期の Task を返すメソッドを記述するポイントは、おそらくスレッドのブロックを回避することですが、RenderAction は Task が完了するまで戻ることができないため、RenderAction は操作が完了するのを待っている間にブロックしてしまうためです。

1 つのオプションは、RenderAction が呼び出すメソッドを非同期ではなく同期にすることです。これにより、元のスレッドが引き続きブロックされることに注意してください。もう 1 つのオプションは、元のアクション メソッド内からレイアウト データを非同期的に入力し、それを ViewData を介してレイアウト ページに渡すことです。

于 2012-10-25T01:42:11.980 に答える