Jestem skończony. Program Visual Studio jest zwykle bardzo powolny do debugowania lub zwykłego ładowania („rozpocznij bez debugowania”) moich witryn ASP.NET MVC. Nie zawsze: na początku projekty ładują się ładnie i szybko, ale gdy ładują się powoli, potem zawsze ładują się wolno. Mogę czekać 1-2 minuty lub dłużej.
Moja konfiguracja:
Obecnie używam Visual Studio 2012 Express , ale miałem ten sam problem w Visual Studio 2010 Express. Moje rozwiązanie jest przechowywane na dysku sieciowym; w szczególności Moje Dokumenty są przekierowywane na dysk sieciowy, jeśli ma to znaczenie. (Nie powinno. Są chwile, w których moja strona ładuje się bardzo szybko przy tej konfiguracji).
Zwykle ładuję się w przeglądarce Internet Explorer 9, ale ten sam problem występuje w przeglądarce Firefox.
Może się to zdarzyć w każdym projekcie ASP.NET MVC, nad którym pracuję, i wydaje się, że obraca się wokół posiadania DisplayTemplates, co robią wszystkie moje projekty ASP.NET MVC. I to wszystko C # i Razor, jeśli to miało znaczenie.
Objawy:
System załaduje moje symbole setki razy. Zasadniczo następujące, ale istnieje co najmniej 300 takich wierszy, każdy z bardzo nieznacznie różnymi plikami DLL dla tych samych CSHTML:
'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.
Powyżej mam trzy DisplayTemplates: „Kontakt”, „Lokalizacja” i „StatusCode”. Wygląda na to, że IIS ładuje symbole dwa razy za każdym razem, gdy wywoływany jest panel informacji. Tak więc, jeśli wyświetlam tabelę zawierającą 100 wpisów, która wywołuje wszystkie trzy powyższe przykłady, to jest ładowanych 600 osobnych symboli.
To też nie jest szybka operacja. Przeglądając pliki dziennika generowane przez IIS, ładowanie każdego symbolu zajmuje około 200 ms. Zatem bardzo długie opóźnienia.
Co próbowałem:
- Wersja debugowania lub wydania nie ma znaczenia.
- Umieszczenie mojego projektu w pełnej implementacji IIS na serwerze WWW działa bardzo szybko, bez żadnych problemów.
- Wszystkie problemy mają Cassini, IIS Express 7.5 i IIS Express 8.0.
- Usuń wszystkie punkty przerwania nic nie robi.
- Czyste rozwiązanie lub usunięcie pliku .suo również nie rób nic.
- Jeśli naprawię IIS Express, usunę
My Docs\IISExpress
folder lub naprawię / ponownie zainstaluję Visual Studio → problem MOŻE zniknąć, ale tylko na chwilę, zanim wróci.
Wszelkie porady są mile widziane.
Aby odpowiedzieć na więcej pytań, tak, moja maszyna zdecydowanie ma moc. Irytujące jest to, że ten sam projekt, ze zmienionymi NICI, może czasami ładować się bardzo szybko, zwykle po naprawie IIS Express i usunięciu My Docs\IISExpress
folderu. W końcu „coś” się dzieje i ładowanie ponownie trwa do 2 minut. To, nad czym pracuję, nie jest skomplikowanym projektem. Brak zewnętrznych bibliotek i zależności, a mój VS.NET nie ma żadnych dodatków.
Warto zauważyć, że ten komputer ma program Symantec Endpoint Protection, który w przeszłości powodował spustoszenie. Ale całkowite wyłączenie go (dobrze być administratorem) nie rozwiązało problemu.
W tym momencie mam teorię. Myślę, że to wszystko dlatego, że pracuję nad przekierowanym folderem z udziału sieciowego. Gdy debugger przechodził przez setki linii „załadowanych symboli”, zatrzymałem się, aby zobaczyć, co robi. To było w moim kodzie, ładowałem DisplayTemplate, który miałem. Wchodząc do szablonu, wyjdź tak:
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'
Wygląda na to, że Visual Studio rekompiluje mój szablon informacji za każdym razem, gdy jest wywoływany, czyli setki razy. Moja teoria jest taka, że Visual Studio kompiluje plik, zapisuje go w udziale sieciowym, udział sieciowy następnie w jakiś sposób zaznacza nowy czas, a następnie Visual Studio myśli, że plik się zmienił, a zatem Visual Studio ponownie go kompiluje. Ale tylko teoria; Naprawdę nie mam pojęcia.
Po pierwsze, najwyraźniej mam pliki offline (jest to komputer stacjonarny w biurze; nie obchodzi mnie to mniej). Wyłączę, uruchomię ponownie i spróbuj ponownie jutro.
Dodatkowo przeniesienie mojego projektu do lokalnego C: naprawia go. Ładuje się bardzo szybko. Ale to nie jest idealne w środowisku pracy. Tracę poprzednie wersje, mój kod nie jest w ogóle tworzony, chyba że go ręcznie skopiuję i nie jest już udostępniany nikomu.
Mogę sobie poradzić z kopiowaniem go tam iz powrotem z C do udziału sieciowego, jeśli chodzi o to. O wiele bardziej irytujące jest czekanie dwóch minut na każde ładowanie strony.