我正在使用Visual Studio 2010中的VB.NET网站。该项目设置为在IIS 7的本地实例中运行网站。如果我只是访问网站http://localhost/mywebsite,则网站正常运行并且进程w3wp.exe正如我所期望的那样跳跃大约2-3%的CPU利用率。一旦我在Visual Studio中运行了一个网站构建,w3wp.exe进程就会高达25%的CPU利用率,并且当我转到IE并测试网站时它会保持不变。如果我再次构建,w3wp.exe进程会跳升到大约50%的CPU利用率,并且当我再次转向IE并测试网站时它会保持在那里。这个过程一直持续到我达到90-100%的CPU使用率,我必须杀死w3wp.exe进程,以便网站重新开始。
有谁知道为什么会这样,以及如何解决它。我认为这与IIS试图使用的Visual Studio覆盖DLL有关。是否最好在后期构建任务中添加app pool reset命令?
我承认我可以运行IIS Express或Visual Studio开发服务器,但我们更愿意使用完整版本的IIS 7进行测试,以确保我们拥有与生产相同的测试环境。
感谢您提供任何帮助。
修改的 我已经缩小了问题范围。我发现,在Jeremy在下面询问Application_Start中运行的任何内容之后,问题是我在应用程序启动时遇到的代码的结果。如果我注释掉我的代码来加载一些带有数据的静态集合,我就不会在重建时获得CPU的峰值。基于此,你知道为什么当我重建项目时,CPU会根据一些代码来加载带有数据的静态集合吗?
这是我用数据加载静态对象的一个例子:
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
另一个编辑 目前,该应用程序配置为在IIS 7中以64位运行,但它是针对“任何CPU”编译的。如果我将IIS中的应用程序池更改为“启用32位应用程序”以使其以32位模式运行,则重建时不会出现CPU峰值,就像应用程序以64位模式运行时一样。
答案 0 :(得分:1)
经过多次浪费时间试图解决这个问题。我将问题缩小到我的64位ODP.net dll版本。我刚刚访问Oracle的网站并将最新的更新下载到ODP.net,问题得到解决。它一定是代码中的一个错误,它们在我的版本和最新版本之间修复。