web-dev-qa-db-ja.com

MVC 6のビューで@await Html.PartialAsyncを使用する場合

Scott Hanselmanのブログの1つで、.Net 5(MVC 6)を使用するときに彼がViewsで次のコードを使用していることに気付きました。

@await Html.PartialAsync("_LoginPartial")

vs.

@Html.Partial("_LoginPartial")

どのドキュメントをいつ使用すべきかについてのドキュメントはまだありますか?

37
RickJames

これは実際には非常に興味深い質問とシナリオです。ある程度まで、非同期は新しいホットネスです(ただし、実際にはそれほど新しいわけではありません)。エンティティフレームワーク6は、非同期メソッドとすべての...単一...の一部...ドキュメント...で突然、すべてに対して非同期の使用を開始しました。ここでも同じことが少し見られると思います。 MVC 6は、パーシャルのレンダリングなどの非同期をサポートしているため、OMGですべてhaveを使用して非同期を使用できます。

非同期は、非常に特定の目的に役立ちます。現在のタスクが待機状態にある間に、アクティブなスレッドをプールに戻して他のタスクを処理することができます。その重要な部分は「待機状態」です。特定のタスクは、非同期と完全に互換性がありません。複雑な財務分析のようなCPUにバインドされた作業では、スレッドが待機状態になることはないため、非同期として設定した場合でも、すべてが同期として効果的に実行されます。一方、ネットワーク遅延(Web APIからのリソースの要求、データベースのクエリなど)を含むもの、またはI/Oにバインドされたもの(ファイルの読み取り/書き込みなど)には、スレッドが存在する期間がある場合があります処理を続行する前に、他のプロセスが完了するのを待ちます。

特にパーシャルのレンダリングを見ると、CPUに完全に依存しているわけではない唯一の部分は、ファイルシステムからビューファイル自体を読み取ることです。これは技術的に非同期に適格となるのに十分ですが、基本的には最大50 KB未満のテキストファイルを読み取るのに実際にどれくらいの時間がかかりますか。スレッドがプールに返されるまでに、おそらくそれを要求する時間です。そのため、実際にはその時点でリソースをより効率的に使用していることになります。

長いことも短いことも、「非同期で実行できるため、非同期で実行する必要がある」というofに陥らないでください。各使用は、実際に価値があるかどうかの観点から評価する必要があります。非同期には多くのオーバーヘッドがあり、数ミリ秒の待機時間について話しているだけであれば、おそらく余分なオーバーヘッドのすべての価値はありません。

34
Chris Pratt

部分ビューに関するASP.NET MVCドキュメントに従って。 https://docs.asp.net/en/latest/mvc/views/partial.html

PartialAsyncメソッドは、非同期コードを含む部分ビューで使用できます(ただし、ビューのコードは一般的に推奨されません)。

また、ページ上のメモ。

ビューでコードを実行する必要がある場合、推奨されるパターンは、部分ビューではなくビューコンポーネントを使用することです。

したがって、Partialを使用し、PartialAsyncを避ける必要があります。また、PartialAsyncに気づいた場合は、何か間違ったことをしているのかどうかを自問する必要があります。代わりにViewComponentを使用するか、ロジックをビューからコントローラーに移動します。

12
Fred

「await Html.PartialAsync」に関して-このリンクはあなたを助けるかもしれません- http://aspnetwebstack.codeplex.com/workitem/601 (コメントも)(以前は正確に何が問題であったかについて)。

私は、MVC 6で構築されている公開Webサイトに取り組んでおり、「await Html.PartialAsync」は「Html.Partial」より高速です-特にビューに多くのコンポーネントが含まれる場合。

Html.PartialAsyncから「待機」を取り出すことは明らかに機能せず、Html.PartialAsyncはタイプ名を吐き出します(つまり、「System.Threading.Tasks.Task`1 [Microsoft.AspNet.Mvc.Rendering.HtmlString]」)実際のビューの代わりに。

1