Estou no limite. O Visual Studio normalmente é muito lento para depurar ou simplesmente carregar ("iniciar sem depurar") meus sites do ASP.NET MVC. Nem sempre: no começo, os projetos carregam bem e rápido, mas depois que carregam devagar, sempre carregam devagar depois disso. Eu poderia estar esperando 1-2 minutos ou mais.
Minha configuração:
Atualmente, estou usando o Visual Studio 2012 Express , mas também tive o mesmo problema no Visual Studio 2010 Express. Minha solução é armazenada em uma unidade de rede; especificamente, são meus documentos redirecionados para uma unidade de rede, se isso importa. (Não deveria. Há momentos em que meu site carrega muito rápido nessa configuração.)
Normalmente, carrego no Internet Explorer 9, mas o mesmo problema ocorre no Firefox.
Isso pode acontecer em qualquer projeto do ASP.NET MVC em que trabalho e parece girar em torno de ter DisplayTemplates, o que todos os meus projetos do ASP.NET MVC fazem. E é tudo C # e Razor, se isso importava.
Sintomas:
O sistema carregará meus símbolos centenas de vezes. Basicamente, o seguinte, mas existem pelo menos 300 linhas desse tipo, cada uma com arquivos DLL sempre um pouco diferentes para os mesmos 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.
Acima, eu tenho três DisplayTemplates: "Contato", "Localização" e "StatusCode". Parece que o IIS está carregando símbolos duas vezes para cada vez que o modelo de exibição é chamado. Portanto, se estou exibindo uma tabela de 100 entradas que chama todos esses três modelos de exibição, são 600 símbolos separados carregados.
Esta também não é uma operação rápida. Examinando os arquivos de log que o IIS gera, são necessários cerca de 200 ms para cada símbolo carregar. Assim, atrasos super longos.
O que eu tentei:
- Versão de depuração ou lançamento, não importa.
- Colocar o meu projeto em uma implementação completa do IIS em um servidor Web é executado muito rápido, sem problemas.
- Cassini, IIS Express 7.5 e IIS Express 8.0 têm o problema.
- Excluir todos os pontos de interrupção não faz nada.
- Solução limpa ou excluir o .suo também não faz nada.
- Se eu reparar o IIS Express, excluir a
My Docs\IISExpress
pasta ou reparar / reinstalar o Visual Studio → o problema PODE desaparecer, mas apenas por um tempo, antes que ele volte.
Qualquer conselho é apreciado.
Para responder a mais perguntas, sim, minha máquina definitivamente tem a potência. O fato irritante é que o mesmo projeto, com NADA alterado, pode carregar muito rapidamente às vezes, normalmente após eu reparar o IIS Express e excluir a My Docs\IISExpress
pasta. Eventualmente, "algo" acontece e é necessário apenas 2 minutos para carregar novamente. O que eu estou trabalhando não é um projeto complicado. Não há bibliotecas ou dependências externas, e meu VS.NET não tem complementos.
É importante notar que esta máquina possui o Symantec Endpoint Protection, que tem um histórico de causar estragos. Mas desativá-lo completamente (é bom ser um administrador) não resolveu o problema.
Eu tenho uma teoria neste momento. Estou pensando que isso é tudo porque estou trabalhando em uma pasta redirecionada de um compartilhamento de rede. Enquanto o depurador passava por centenas de linhas de "símbolos carregados", parei para ver o que estava fazendo. Estava no meu código, carregando o DisplayTemplate que eu tinha. Entrar no modelo gera isso:
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'
Parece que o Visual Studio está recompilando meu modelo de exibição toda vez que é chamado, o que é novamente, centenas de vezes. Minha teoria é que o Visual Studio compila o arquivo, o salva no compartilhamento de rede, o compartilhamento de rede, de alguma forma, imprime uma nova vez, e o Visual Studio pensa que o arquivo foi alterado e, portanto, o Visual Studio o recompila novamente. Apenas uma teoria; Eu realmente não tenho ideia.
Por um lado, aparentemente eu tenho arquivos offline (este é um computador desktop em um escritório; eu não poderia me importar menos). Vou desativar, reiniciar e tentar novamente amanhã.
Além disso, mover o meu projeto, como está, para o C: local, corrige-o. Carrega muito rapidamente. Mas isso não é ideal em um ambiente de trabalho. Perco as versões anteriores, meu código não é copiado, a menos que eu o copie manualmente e não seja mais compartilhado com ninguém.
Eu posso me contentar em copiá-lo de C para o compartilhamento de rede, se for o caso. É muito mais irritante esperar dois minutos para cada carregamento de página.