【发布时间】:2011-07-07 14:08:47
【问题描述】:
我正在使用 Visual Studio 2010 开发一个 VB.NET 网站。该项目设置为在 IIS 7 的本地实例中运行该网站。如果我只是访问该网站,http://localhost/mywebsite,该网站运行正常,并且正如我所料,w3wp.exe 进程的 CPU 利用率会提高 2-3%。当我在 Visual Studio 中运行网站的构建时,w3wp.exe 进程的 CPU 利用率会上升到 25%,当我切换到 IE 并测试网站时,它会一直保持在那里。如果我再次构建,w3wp.exe 进程会跃升至大约 50% 的 CPU 使用率,并且当我再次切换到 IE 并测试网站时它会保持在那里。这个过程一直持续到我达到 90-100% 的 CPU 使用率,我必须终止 w3wp.exe 进程,以便网站重新启动。
有谁知道为什么会发生这种情况,以及如何解决它。我认为这与 Visual Studio 覆盖 IIS 尝试使用的 DLL 有关。是否最好将应用程序池重置命令添加到构建后任务?
我承认我可以运行 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 位模式下运行,则在重建时不会像在 64 位模式下运行应用程序时那样出现 CPU 峰值。
【问题讨论】:
-
这可能在您的应用程序代码中。仅仅因为您停止调试并且浏览器窗口关闭,并不意味着已启动的请求将停止。你的 global.asax 中有什么不寻常的地方吗?
-
我实际上从未进入调试模式。我正在针对 IIS 7 的本地实例运行,所以它永远不会停止。我在 global.asax 中加载了一些静态对象。虽然我不能 100% 确定加载这些对象的代码没有错误,但我认为这不是问题所在。正如我上面所说,代码第一次运行时,它的行为正常,只是额外的构建使 CPU 达到峰值。
标签: vb.net visual-studio-2010 iis iis-7