Я работаю над веб-сайтом VB.NET в Visual Studio 2010. Проект настроен на запуск веб-сайта в локальном экземпляре IIS 7. Если я просто получаю доступ к веб-сайту, http://localhost/mywebsite, веб-сайт работает нормально и процесс w3wp.exe скачет около 2-3% загрузки процессора, как я и ожидал. Как только я запускаю сборку веб-сайта в Visual Studio, процесс w3wp.exe скачет до 25% загрузки ЦП и остается там, когда я переключаюсь в IE и тестирую веб-сайт. Если я соберу снова, процесс w3wp.exe подскочит примерно до 50% загрузки ЦП и останется там, когда я снова переключусь на IE и протестирую веб-сайт. Этот процесс продолжается до тех пор, пока я не достигну 90–100% загрузки ЦП, и мне придется завершить процесс w3wp.exe, чтобы сайт снова запускался.
Кто-нибудь знает, почему это происходит, и как это решить. Я предполагаю, что это как-то связано с перезаписывающими библиотеками Visual Studio, которые пытается использовать IIS. Будет ли лучше добавить команду сброса пула приложений к задачам после сборки?
Я подтверждаю, что могу запустить IIS Express или Visual Studio Development Server, но мы предпочитаем проводить тестирование с использованием полной версии IIS 7, чтобы убедиться, что у нас есть среда тестирования, идентичная рабочей.
Спасибо за любую помощь, которую вы можете оказать.
Редактировать
Я сузил проблему. После того, как Джереми спросил о том, что выполняется в Application_Start, я обнаружил, что проблема связана с кодом, который я имею при запуске приложения. Если я закомментирую свой код для загрузки некоторых статических коллекций с данными, я не получу скачок ЦП при перестройке. Итак, исходя из этого, знаете ли вы, почему, когда я перестраиваю проект, процессор будет всплывать на основе некоторого кода для загрузки статической коллекции с данными?
Это пример того, что я делаю, чтобы загрузить статический объект данными:
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
MyObjects.Load(connectionString)
End Sub
Public Class MyObjects
Private Shared _objects As Dictionary(Of String, Dictionary(Of String, MyObject)) = Nothing
Private Shared _lockObject As New Object
Private Shared _connectionString As String = Nothing
Shared Sub New()
End Sub
Shared Sub Load(ByVal s As String)
Dim qry As StringBuilder = Nothing
Dim dt As DataTable = Nothing
Dim tempDefHolder As Dictionary(Of String, Dictionary(Of String, MyObject)) = Nothing
qry = New StringBuilder()
qry.AppendLine("my query")
_connectionString = s
dt = New DataTable()
Using conn As New OracleConnection(_connectionString)
Using cmd As New OracleCommand(qry.ToString(), conn)
Using da As New OracleDataAdapter(cmd)
conn.Open()
da.Fill(dt)
End Using
End Using
End Using
tempDefHolder = LoadMyObjectsFromDataTable(dt) '(turns datatable into dictionary of objects
'assign _objects using synclock
SyncLock _lockObject
_objects= tempDefHolder
End SyncLock
End Sub
End Class
Другое Править
В настоящее время приложение настроено для работы в 64-разрядной версии в IIS 7, но оно скомпилировано для «Любого процессора». Если я изменю пул приложений в IIS на «Включить 32-разрядные приложения», чтобы он работал в 32-разрядном режиме, при перестройке не произойдет скачка ЦП, как при работе приложения в 64-разрядном режиме.