私はひどく終わりました。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つのDisplayTemplateを取得しています。IISは、displaytemplateが呼び出されるたびにシンボルを2回ロードしているようです。したがって、これら3つの表示テンプレートすべてを呼び出す100エントリのテーブルを表示している場合、600の個別のシンボルが読み込まれます。
これも高速な操作ではありません。IISが生成するログファイルを見ると、各シンボルの読み込みに約200ミリ秒かかります。したがって、超長い遅延。
私が試したこと:
- デバッグまたはリリースバージョン、それは重要ではありません。
- プロジェクトをWebサーバー上の完全なIIS実装に配置すると、問題なく超高速で実行されます。
- Cassini、IIS Express 7.5、およびIIS Express 8.0にはすべて問題があります。
- [すべてのブレークポイントを削除]は何もしません。
- Clean Solution、または.suoを削除しても何も起こりません。
- IIS Expressを修復したり、
My Docs\IISExpress
フォルダーを削除したり、Visual Studioを修復または再インストールしたりすると、問題が解消する可能性がありますが、しばらくすると、すぐに戻ってきます。
アドバイスは大歓迎です。
より多くの質問に答えるために、はい、私のマシンは間違いなく馬力を持っています。苛立たしいことは、何も変更されていない同じプロジェクトが、IIS Expressを修復してMy Docs\IISExpress
フォルダを削除した後で、非常に高速にロードされることがあるということです。最終的に「何か」が発生し、再度ロードするまでに2分かかります。私が取り組んでいるのは複雑なプロジェクトではありません。外部ライブラリや依存関係はなく、私のVS.NETにはまったくアドオンがありません。
注目に値するのは、このマシンにはSymantec Endpoint Protectionがあり、これは大混乱を引き起こした歴史があります。しかし、それを完全に無効にしても(管理者であることが望ましい)、問題は解決しませんでした。
この時点で私は理論を持っています。これは、ネットワーク共有からリダイレクトされたフォルダーから作業しているためです。デバッガーが何百もの「ロードされたシンボル」の行を通過している間、デバッガーが何をしているかを確認するために一時停止しました。それは私のコードにあり、私が持っていた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が再び再コンパイルするというものです。ただし、理論だけです。本当に手がかりはありません。
1つには、オフラインファイルを持っているようです(これはオフィスのデスクトップコンピューターです。あまり気になりませんでした)。無効にして再起動し、明日再試行します。
さらに、私のプロジェクトをそのままローカルCに移動すると、修正されます。非常に速く読み込まれます。しかし、これは作業環境では理想的ではありません。以前のバージョンを失うと、自分のコードを手動でコピーしない限り、コードはまったくバックアップされず、誰とも共有されなくなります。
それに関しては、Cからネットワーク共有に前後にコピーすることで対処できます。ページの読み込みごとに2分間待つのははるかに煩わしいです。