571 Stimmen

Visual Studio Debugging/Laden sehr langsam

Ich bin mit meinem Latein am Ende. Visual Studio ist typischerweise Meine ASP.NET MVC-Sites lassen sich nur sehr langsam debuggen oder einfach nur laden ("Start ohne Debugging"). Nicht immer: Zunächst werden die Projekte schön schnell geladen, aber sobald sie langsam geladen werden, werden sie danach immer langsam geladen. Ich könnte 1-2 Minuten oder länger warten.

Meine Einstellung:

Ich benutze Visual Studio 2012 Express Derzeit, aber ich habe das gleiche Problem in Visual Studio 2010 Express als auch hatte. Meine Projektmappe ist auf einem Netzlaufwerk gespeichert, genauer gesagt unter "Eigene Dateien", das auf ein Netzlaufwerk umgeleitet wurde, falls das eine Rolle spielt. (Das sollte es nicht. Es gibt Zeiten, in denen meine Website unter dieser Konfiguration sehr schnell geladen wird).

Normalerweise lade ich im Internet Explorer 9, aber das gleiche Problem tritt auch im Firefox auf.

Dies kann in jedem ASP.NET MVC-Projekt passieren, an dem ich arbeite, und es scheint sich um DisplayTemplates zu drehen, die alle meine ASP.NET MVC-Projekte tun. Und es ist alles C# und Razor, wenn das wichtig ist.

Die Symptome:

Das System wird meine Symbole laden Hunderte von Zeiten. Im Grunde das Folgende, aber es gibt mindestens 300 solcher Zeilen, jede mit immer leicht unterschiedlichen DLL-Dateien für die gleichen CSHTMLs:

'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.

Im obigen Beispiel habe ich drei DisplayTemplates: "Kontakt", "Standort" und "StatusCode". Es scheint, dass IIS die Symbole bei jedem Aufruf der Anzeigevorlage zweimal lädt. Wenn ich also eine Tabelle mit 100 Einträgen anzeige, die alle drei dieser Anzeigevorlagen aufrufen, werden 600 separate Symbole geladen.

Auch dies ist keine schnelle Operation. Die Protokolldateien, die der IIS erzeugt, brauchen etwa 200 ms, um jedes Symbol zu laden. Es kommt also zu sehr langen Verzögerungen.

Was ich ausprobiert habe:

  • Debug- oder Release-Version, das spielt keine Rolle.
  • Wenn ich mein Projekt auf eine vollständige IIS-Implementierung auf einem Webserver setze, läuft es superschnell und ohne Probleme.
  • Cassini, IIS Express 7.5 und IIS Express 8.0 haben alle das Problem.
  • Alle Haltepunkte löschen bewirkt nichts.
  • Saubere Lösung oder das Löschen der .suo-Datei bewirken ebenfalls nichts.
  • Wenn ich IIS Express repariere/den My Docs\IISExpress oder Visual Studio reparieren/neu installieren, kann das Problem verschwinden, aber nur für eine gewisse Zeit, bevor es wieder auftritt.

Für jeden Ratschlag bin ich dankbar.

Um weitere Fragen zu beantworten: Ja, meine Maschine hat definitiv Pferdestärken. Das Ärgerliche daran ist, dass dasselbe Projekt, an dem NICHTS geändert wurde, manchmal sehr schnell geladen werden kann, typischerweise nachdem ich IIS Express repariert und die My Docs\IISExpress Ordner. Irgendwann passiert dann "etwas", und es dauert wieder 2 Minuten, bis es geladen ist. Das Projekt, an dem ich arbeite, ist nicht kompliziert. Keine externen Bibliotheken oder Abhängigkeiten und mein VS.NET hat keinerlei Add-ons.

Auf diesem Rechner ist Symantec Endpoint Protection installiert, das in der Vergangenheit immer wieder für Unruhe gesorgt hat. Die vollständige Deaktivierung (es ist gut, ein Administrator zu sein) hat das Problem jedoch nicht behoben.

Ich habe an dieser Stelle eine Theorie. Ich denke, das liegt daran, dass ich mit einem umgeleiteten Ordner auf einer Netzwerkfreigabe arbeite. Während der Debugger durch seine Hunderte von Zeilen mit "geladenen Symbolen" ging, hielt ich inne, um zu sehen, was er tat. Er war in meinem Code und lud das DisplayTemplate, das ich hatte. Stepping in der Vorlage Ausgabe dies:

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'

Es sieht so aus, als würde Visual Studio meine Anzeigevorlage neu kompilieren jedes Mal und das sind wiederum Hunderte von Malen. Meine Theorie ist, dass Visual Studio die Datei kompiliert, sie auf der Netzwerkfreigabe speichert, dann irgendwie eine neue Zeit darauf stempelt und Visual Studio dann denkt, dass die Datei sich geändert hat. Daher kompiliert Visual Studio die Datei noch einmal neu. Das ist aber nur eine Theorie; ich habe wirklich keine Ahnung.

Zum einen habe ich anscheinend Offline-Dateien (dies ist ein Desktop-Computer in einem Büro; das ist mir völlig egal). Ich werde das Programm deaktivieren, neu starten und es morgen erneut versuchen.

Außerdem wird das Problem durch das Verschieben meines Projekts auf das lokale C: behoben. Es lädt sehr schnell. Aber in einer Arbeitsumgebung ist das nicht ideal. Ich verliere frühere Versionen, mein Code wird überhaupt nicht gesichert, es sei denn, ich kopiere ihn manuell, und er wird nicht mehr mit anderen geteilt.

Wenn es sein muss, kann ich sie auch einfach von C auf das Netzwerk kopieren. Es ist viel ärgerlicher, zwei Minuten zu warten, bis jede Seite geladen ist.

32voto

rkawano Punkte 2293

Haben Sie FusionLog aktiviert?

Mein VisualStudio war sehr langsam beim Starten, Öffnen der Lösung und Laden der Symbole, wenn ich mit dem Debugging begann. Es war nur auf meinem Rechner langsam, aber nicht auf anderen Rechnern.

FusionLog schreibt Unmengen von Protokolldaten auf die Festplatte. In meinem Fall hat das Deaktivieren in RegEdit alles gelöst.

Dies ist der FusionLog-Schlüssel in der Registry:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion

Prüfen Sie den ForceLog-Wert (1 aktiviert, 0 deaktiviert).

25voto

Ber'Zophus Punkte 7237

Ich glaube, ich kenne jetzt zumindest die Ursache, wenn auch nicht den Grund dafür. Als das Problem wieder auftrat, stellte ich fest, dass eine Menge "conhost.exe"-Prozesse verwaist waren. Wenn ich Visual Studio schloss, blieben sie geöffnet. Das Beenden jedes einzelnen Prozesses hat das Problem schließlich zuverlässig gelöst. [Hoffentlich]

(Beachten Sie bitte, dass conhost.exe kein Visual Studio-Prozess ist, obwohl Visual Studio ihn verwendet. Es kann also sein, dass andere Benutzer andere Anwendungen haben, die conhost.exe ausführen. Ich weiß, dass mein Rechner das nicht tut, weshalb ich alle Anwendungen sicher beenden kann, aber YMMV).

Warum ist das so? Es scheint aufzutreten, wenn ich mehr als ein Projekt gleichzeitig öffne, was ich oft tue, auch wenn ich immer nur eines davon baue und debugge.


Edit #1 - Das ist leider kein Patentrezept. Bei mir funktioniert es nicht immer. Normalerweise, wenn die Dinge langsam werden, schließe ich einfach alle meine Visual Studio-Sitzungen, dann gehen Sie in den Task-Manager und beenden Sie jede Instanz von es, conhost.exe, iisexpress.exe Microsoft.VisualStudio.Web.Host.exe und MSBuild.exe ich finden kann.

Wenn ich danach mein Projekt neu starte, wird es in der Regel schnell geladen. Aber nicht immer.

Ich denke, dass es am besten ist, keinen Code aus einem umgeleiteten Ordner/Netzwerkfreigabe zu erstellen und zu debuggen.


Edit #2 - Zwei Jahre später, und dies ist immer noch ein Problem für mich in Visual Studio Community 2013, aber ich schien zumindest die schuldige Aufgabe zu finden: Explorer.exe . Ja, wer hätte das gedacht. In dem Moment, in dem ich diese Aufgabe beende, lädt die Seite in einer einzigen Sekunde.

Wenn ich im Windows Explorer einen Dateibrowser für mein umgeleitetes Netzlaufwerk geöffnet habe (was häufig der Fall ist, da sich dort mein Code befindet), scheint dieses Problem aufzutreten. Es reicht nicht aus, das Fenster zu schließen, sondern ich muss die gesamte Aufgabe Explorer.exe beenden. Ich kann nur raten, was es tut... es spielt mit den Datei-Handles verrückt?

Ich kann normalerweise den Task-Manager verwenden, um eine neue explorer.exe-Aufgabe zu starten (ich kann nur so viel Alt-Tabbing ertragen), und Visual Studio wird weiterhin schön und schnell geladen. Aber wenn ich so viel wie Windows Explorer wieder öffnen, es geht fast immer zurück zu super-slow-mo.

Wenn Sie also eine umgeleitete Netzwerkfreigabe haben, sollten Sie es ausprobieren. Es ist auf jeden Fall besser, als lokal zu arbeiten.

23voto

Tahir Hassan Punkte 5469

Die oben genannten Lösungen sind alle gut und ich habe sie alle ausprobiert, aber ich habe die Lösung ici die sich auf

Debug -> Delete All Breakpoints

20voto

DMadden51 Punkte 391

Bei mir war es IE 9.08.8112.16241. Sobald ich Firefox oder Chrome verwendet habe, gab es kein träges Debugging mit F10 oder F11. Ich weiß nicht, was das Problem mit IE ist, aber ich offiziell verachten mit ihm für die Prüfung jetzt.

Update: Ich habe alle IE-Programm-Add-ons deaktiviert und die volle Geschwindigkeit ist wiederhergestellt. Wenn ich sie einzeln einschaltete, stellte sich heraus, dass LastPass (in meinem Fall) der Übeltäter war. Ich schätze, ich kann MS doch nicht die Schuld geben.

Einige Jahre in der Zukunft...
Wenn Sie Brave verwenden, können Sie leicht auf Ihre Erweiterungen zugreifen und sie einzeln (oder mehrere) während des Debuggens deaktivieren.

brave://extensions

Klicken Sie einfach auf den Schieberegler. Beachten Sie, dass alle meine eingeschaltet sind, außer DuckDuckGo Privacy Essentials. Sie sind nicht entfernt, nur vorübergehend deaktiviert.

enter image description here

20voto

Korayem Punkte 11177

Für mich habe ich Folgendes umgesetzt dieser Tipp die im Grunde genommen die Leistung drastisch verbessert hat, indem sie die folgenden beiden Attribute zum Kompilierungs-Tag in web.config

<compilation ... batch="false" optimizeCompilations="true"> ... </compilation>

Was bedeutet batch="false" tun?

Sie macht die Vorkompilierung selektiver, indem sie nur Seiten kompiliert, die die sich geändert haben und neu kompiliert werden müssen

Was genau ist die optimizeCompilations tun? Quelle

ASP.NET verwendet für jede Anwendung einen Hash-Code, der den Zustand einer einer Reihe von Dingen enthält, darunter die bin y App_Code Ordner, und global.asax . Jedes Mal, wenn eine ASP.NET-Anwendungsdomäne gestartet wird, prüft sie, ob dieser Hash-Code gegenüber dem zuvor berechneten geändert hat. Wenn dies der Fall ist, dann wird die gesamte codegen Ordner (wo kompiliert und Schatten kopiert Assemblies befinden) wird gelöscht.

Wenn diese Optimierung aktiviert ist (über optimizeCompilations="true" ), wird der Hash nicht mehr berücksichtigt bin , App_Code y global.asax . Wenn sich diese also ändern, werden wir nicht auslöschen die codegen Ordner.

Referenz: Kompilierungselement auf MSDN

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X