Visual Studio 2010 - высокая загрузка ЦП после сборки сайта - PullRequest
1 голос
/ 07 июля 2011

Я работаю над веб-сайтом 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-разрядном режиме.

1 Ответ

1 голос
/ 07 июля 2011

После многих потерянных часов, пытаясь понять это. Я сузил проблему до моей версии 64-битной библиотеки ODP.net. Я просто зашел на сайт Oracle и скачал новейшее обновление для ODP.net, и проблема была исправлена. Должно быть, в их коде была ошибка, которую они исправили где-то между моей версией и самой новой версией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...