.net wpf应用程序启动问题

时间:2011-03-14 10:08:19

标签: .net wpf startup

我的应用程序有一个非常奇怪的启动行为。

第一次启动应用程序时,该进程占用一个CPU内核(双核50%,四核25%),RAM消耗停止在特定值(每个启动相同,不同于其他机器/不同构建版本,因为我们将应用程序更改为测试)。

如果我在第一个实例运行时启动另一个实例,则第二个实例正常启动。

我在应用程序中插入了一些日志记录,看起来应用程序在第一次显示UI元素时崩溃了。最初在启动屏幕显示之前结束日志记录 - 删除启动屏幕后,它将停止显示消息框控件。

问题出现在某些机器上,而不是全部。将相同的文件复制到另一台计算机可以“修复”问题。如果我部署由我的工作站构建的调试编译版本,则问题会完全消失。

其他信息(3月18日):所需的“挂起”实例计数似乎取决于可用内核的数量。

如果机器在双核 *系统上运行,则第二个进程启动,第一个进程占用50%CPU(= 1核@ 100%)。如果机器在四核系统上运行,则*第四个进程启动,前三个每个占用25%的CPU(= 3个核@ 100%)。

更新(3月19日): 所以...我们解决了它! 一位同事用一些代码写了一个线程管理器来等待某事。在显示UI元素时调用此管理器。在非常慢的VM上运行调试版本或运行发行版本(功能正常的机器在真正繁忙的机器上是虚拟机器)似乎改变了时间并使其工作。

他说他实施了某种超时来修复它。

我将在星期一仔细研究他的解决方案(以及为什么需要这些奇怪的事情)并在此处发布更新,以便为我的访问者提供正确的解决方案。

赏金给Stephen Chung,谢谢大家的帮助。

3 个答案:

答案 0 :(得分:1)

你的问题不是很清楚。您应该尝试提供尽可能多的调试/错误日志信息。

Hunch

但是,考虑到你使用的是100%的CPU内核,这听起来很可疑。你在做线程吗?你在使用ThreadPool吗? .NET程序至少需要一些备用的ThreadPool线程才能运行 - 几年前,如果你在ThreadPool中运行线程(运行永无止境的循环等),以及免​​费的数量,它曾经是如此线程低于3,系统将崩溃。如果你正在使用它,你应该检查ThreadPool中的空闲线程数。

这只是一种预感。

总结问题

但是,我想在下面总结一下你的问题。看看我是否做对了:

  1. 程序将仅占用一个核心上的100%CPU时间 - 这表明只有一个线程(因为更多线程将在另一个CPU上调度) - 什么你正在做那种可怜的CPU内核,它会像这样紧张吗??? !!!你是否正在做System.Threading.Thread.Sleep()偶尔产生一些CPU时间回系统?您是否将流程标记为后台优先级而不是高优化?
  2. n-1 程序实例运行正常(n =核心数)。
  3. 第n个程序实例将失败(n =核心数)。
  4. 失败的原因是无法在Windows界面中打开窗口。
  5. 失败模式

    这种模式似乎表明,当你的上一个程序在最后 CPU上占用100%的时间时,Windows进程将争夺CPU时间。

    如果您有一个免费核心,那么Windows进程可以始终在该核心上运行,您的UI将具有响应能力。一旦你这样做了,你可能会看到Windows在没有响应的应用程序上检测到超时 - 你可能会使机器过度紧张而Windows无法运行。

    测试:运行 n 程序实例(n =核心数)。然后运行其他程序。他们会迟钝,还是他们会好起来的?

答案 1 :(得分:1)

是的,你应该针对所有相同版本的运行时,你也应该看看fusion log(.NET加载器的日志试图获得正确版本的二进制文件)。

查看Suzanne's blog她有很多关于冷启动性能问题/调整的信息。

答案 2 :(得分:0)

尝试剥离应用程序启动代码。如果问题在启动画面可见之前显示,则表示您的代码停止了机器或WPF中存在错误。

您是否在Application对象构造函数中运行任何代码?