1. ホーム
  2. asp.net-mvc

[解決済み] Visual Studioのデバッグ/ロードが非常に遅い

2022-02-19 22:15:02

質問

途方に暮れています。Visual Studioは 通常 ASP.NET MVCのサイトをデバッグしたり、単純にロードする("デバッグせずに起動する)のに非常に時間がかかります。いつもというわけではありません。最初は、プロジェクトの読み込みは快調で速いのですが、一度読み込みが遅くなると、その後は常に読み込みが遅くなります。1-2分以上待たされることもあります。

私の設定

を使っています。 Visual Studio 2012 Express 現在、Visual Studio 2010 Expressでも同じ問題が発生しています。私のソリューションはネットワークドライブに保存されており、具体的には、ネットワークドライブにリダイレクトされたマイドキュメントです。(これは重要ではありません。この設定で私のサイトが非常に速くロードされることがあります)。

通常Internet Explorer 9で読み込みますが、Firefoxでも同じ問題が発生します。

これは、私が手がけるASP.NET MVCのどのプロジェクトでも起こりうることで、私のASP.NET MVCプロジェクトではすべてそうですが、DisplayTemplatesを持つことが中心になっているようです。そして、それはすべてC#とRazorで、もしそれが重要なら。

症状について

システムは私のシンボルをロードします 何百 を何度も繰り返す。基本的には以下の通りですが、このような行が少なくとも300行あり、それぞれ同じCSHTMLに対して、これまでとは微妙に異なるDLLファイルになっています。

'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_contact.cshtml.22013bb9.xighmhow.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_contact.cshtml.22013bb9.cv5hktkf.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.1o77hs8i.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.jja-77mw.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_location.cshtml.22013bb9.l_e9ev_s.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_location.cshtml.22013bb9.b4n59gom.dll', Symbols loaded.

上記では、"Contact", "Location", "StatusCode" という3つのDisplayTemplatesを持っています。IISは、表示テンプレートが呼び出されるたびに、シンボルを2回ロードしているようです。したがって、これらの3つの表示テンプレートをすべて呼び出す100のエントリーのテーブルを表示する場合、600の別々のシンボルがロードされることになります。

これも高速な動作ではありません。IISが生成するログファイルは、各シンボルの読み込みに約200msかかるのです。したがって、超長時間の遅延が発生します。

試してみたこと

  • デバッグ版でもリリース版でもかまいません。
  • 私のプロジェクトをウェブサーバー上の完全なIIS実装に置くと、何の問題もなく超高速で動作します。
  • Cassini、IIS Express 7.5、IIS Express 8.0のいずれでも問題が発生します。
  • すべてのブレークポイントを削除しても何も起こりません。
  • クリーンソリューション や、.suoを削除しても、何も起こりません。
  • IIS Expressを修復する、または My Docs\IISExpress フォルダを削除したり、Visual Studio を修復/再インストールしたりすると、問題は解決するかもしれませんが、しばらくの間だけで、すぐに再発します。

何かアドバイスがあれば、よろしくお願いします。

より多くの質問に答えるために、はい、私のマシンは確かに馬力があります。腹立たしいことに、何も変更していない同じプロジェクトが、IIS Expressを修復して My Docs\IISExpress フォルダーに格納されます。結局、quot;something" が起こり、再びロードするのに2分かかるようになりました。私が取り組んでいるのは、複雑なプロジェクトではありません。外部ライブラリや依存関係はなく、私のVS.NETにはアドオンは一切ありません。

このマシンにはSymantec Endpoint Protectionが搭載されていますが、これは大惨事を引き起こした過去があります。しかし、それを完全に無効にしても(管理者であることは良いことです)、問題は解決しませんでした。

この時点で仮説があります。ネットワーク共有のリダイレクトされたフォルダーで作業しているからだと思うのです。デバッガが何百もの "loaded symbols" 行を通過している間、私は一時停止してそれが何をしているのか確認しました。それは私のコードの中にあり、私が持っている DisplayTemplate を読み込んでいました。そのテンプレートにアクセスすると、このように出力されます。

Step into: Stepping over non-user code 'System.Threading.WaitHandle.InternalWaitOne'
Step into: Stepping over non-user code 'System.Threading.WaitHandle.WaitOne'
Step into: Stepping over non-user code 'System.CodeDom.Compiler.Executor.ExecWaitWithCaptureUnimpersonated'
Step into: Stepping over non-user code 'System.CodeDom.Compiler.Executor.ExecWaitWithCapture'
Step into: Stepping over non-user code 'Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch'
Step into: Stepping over non-user code 'Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromFileBatch'
Step into: Stepping over non-user code 'System.Web.Compilation.AssemblyBuilder.Compile'
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.bciuyg14.dll', Symbols loaded.
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.CompileWebFile'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVPathBuildResultInternal'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists'
Step into: Stepping over non-user code 'System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName'
Step into: Stepping over non-user code 'System.Web.Mvc.VirtualPathProviderViewEngine.FindPartialView'
Step into: Stepping over non-user code 'System.Web.Mvc.ViewEngineCollection.Find'
Step into: Stepping over non-user code 'System.Web.Mvc.ViewEngineCollection.FindPartialView'
Step into: Stepping over non-user code 'System.Web.Mvc.Html.TemplateHelpers.ActionCacheViewItem.Execute'
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.kwj3uqan.dll', Symbols loaded.
Step into: Stepping over non-user code 'System.RuntimeType.CreateInstanceSlow'
Step into: Stepping over non-user code 'System.Web.Mvc.DependencyResolver.DefaultDependencyResolver.GetService'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerViewEngine.DefaultViewPageActivator.Create'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerCompiledView.Render'

Visual Studio が私の表示用テンプレートを再コンパイルしているようです。 毎回 が呼び出されるのですが、これがまた何百回とあるのです。私の考えでは、Visual Studioがファイルをコンパイルしてネットワーク共有に保存し、何らかの方法でそれに新しい時間をスタンプし、Visual Studioはそのファイルが変更されたと考えています。そのため、Visual Studioは再びファイルを再コンパイルしています。しかし、あくまで仮説であり、実際には何の手がかりもありません。

ひとつは、どうやらオフラインのファイルが入っているようなのです(これはオフィスのデスクトップパソコンなので、気にすることはありません)。明日、無効にして再起動し、再試行するつもりです。

さらに、私のプロジェクトをそのまま、ローカルのC:に移動させると直りました。読み込みがとても速くなりました。しかし、これは作業環境としては理想的ではありません。前バージョンが失われ、手動でコピーしない限り私のコードはまったくバックアップされず、もはや誰とも共有されないのです。

いざとなったらCからネットワーク共有にコピーして往復すればなんとかなる。ページ読み込みのたびに2分も待たされる方がよっぽど迷惑だ。

解決方法は?

Visual Studio 2012で、シンボルの読み込みが遅い問題を解決した方法を紹介します。

  • ツール -> オプション -> デバッグ -> 一般 を選択します。

  • Enable Just My Code"の横にあるチェックマークをオンにします。

  • ツール -> オプション -> デバッグ -> シンボル に移動します。

  • ボタンをクリックし、ローカル コンピュータのどこかにキャッシュされたシンボルを保存するための新しいフォルダを作成または選択します。私は "Symbol caching" と名付け、Documents -> Visual Studio 2012 に置きました。

  • "すべてのシンボルを読み込む"をクリックし、マイクロソフトのサーバーからシンボルがダウンロードされるのを待ちます(しばらく時間がかかる場合があります)。 Load all symbolsボタンはデバッグ中のみ有効ですのでご注意ください。

  • Visual StudioがリモートでMicrosoftサーバーに問い合わせるのを防ぐために、"Microsoft Symbol Servers"の横のチェックマークをオフにします。

  • OK"をクリックします。

これからは、シンボルの読み込みがより速くなるはずです。

Microsoft アセンブリに何らかの変更/ダウンロードを行った場合、[シンボル] ダイアログ ボックスに戻って "Load all symbols" を再度実行する必要があるかもしれないことに注意してください。