我的应用程序有一个非常奇怪的启动行为。
第一次启动应用程序时,该进程占用一个CPU内核(双核50%,四核25%),RAM消耗停止在特定值(每个启动相同,不同于其他机器/不同构建版本,因为我们将应用程序更改为测试)。
如果我在第一个实例运行时启动另一个实例,则第二个实例正常启动。
我在应用程序中插入了一些日志记录,看起来应用程序在第一次显示UI元素时崩溃了。最初在启动屏幕显示之前结束日志记录 - 删除启动屏幕后,它将停止显示消息框控件。
问题出现在某些机器上,而不是全部。将相同的文件复制到另一台计算机可以“修复”问题。如果我部署由我的工作站构建的调试编译版本,则问题会完全消失。
其他信息(3月18日):所需的“挂起”实例计数似乎取决于可用内核的数量。
如果机器在双核 *系统上运行,则第二个进程启动,第一个进程占用50%CPU(= 1核@ 100%)。如果机器在四核系统上运行,则*第四个进程启动,前三个每个占用25%的CPU(= 3个核@ 100%)。
更新(3月19日): 所以...我们解决了它! 一位同事用一些代码写了一个线程管理器来等待某事。在显示UI元素时调用此管理器。在非常慢的VM上运行调试版本或运行发行版本(功能正常的机器在真正繁忙的机器上是虚拟机器)似乎改变了时间并使其工作。
他说他实施了某种超时来修复它。
我将在星期一仔细研究他的解决方案(以及为什么需要这些奇怪的事情)并在此处发布更新,以便为我的访问者提供正确的解决方案。
赏金给Stephen Chung,谢谢大家的帮助。
答案 0 :(得分:1)
你的问题不是很清楚。您应该尝试提供尽可能多的调试/错误日志信息。
但是,考虑到你使用的是100%的CPU内核,这听起来很可疑。你在做线程吗?你在使用ThreadPool吗? .NET程序至少需要一些备用的ThreadPool线程才能运行 - 几年前,如果你在ThreadPool中运行线程(运行永无止境的循环等),以及免费的数量,它曾经是如此线程低于3,系统将崩溃。如果你正在使用它,你应该检查ThreadPool中的空闲线程数。
这只是一种预感。
但是,我想在下面总结一下你的问题。看看我是否做对了:
这种模式似乎表明,当你的上一个程序在最后 CPU上占用100%的时间时,Windows进程将争夺CPU时间。
如果您有一个免费核心,那么Windows进程可以始终在该核心上运行,您的UI将具有响应能力。一旦你这样做了,你可能会看到Windows在没有响应的应用程序上检测到超时 - 你可能会使机器过度紧张而Windows无法运行。
测试:运行 n 程序实例(n =核心数)。然后运行其他程序。他们会迟钝,还是他们会好起来的?
答案 1 :(得分:1)
是的,你应该针对所有相同版本的运行时,你也应该看看fusion log(.NET加载器的日志试图获得正确版本的二进制文件)。
查看Suzanne's blog她有很多关于冷启动性能问题/调整的信息。
答案 2 :(得分:0)
尝试剥离应用程序启动代码。如果问题在启动画面可见之前显示,则表示您的代码停止了机器或WPF中存在错误。
您是否在Application对象构造函数中运行任何代码?