【问题标题】:.net wpf application startup issues.net wpf 应用程序启动问题
【发布时间】:2011-03-19 19:10:09
【问题描述】:

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

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

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

我在应用程序中插入了一些日志记录,似乎应用程序在第一次显示 UI 元素时崩溃了。最初的日志记录在启动画面出现之前就结束了 - 删除启动画面后,它停止了,因为应该显示消息框控件。

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

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

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

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

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

我将在周一仔细研究他的解决方案(以及为什么需要这样奇怪的事情)并在此处发布更新,以便为我的问题提供适当的解决方案以供关注的访问者使用。

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

【问题讨论】:

  • 应用程序是否总是在同一台机器上失败?您的目标是哪个 .NET 版本?所有机器上的 .NET 版本/服务包都相同吗?
  • 同样的机器,我们的目标是 .net 4.0。所有机器上安装的 .net 版本均为 3.5 SP1 和 4.0(完整)
  • 还有一件事;所有机器上的操作系统都一样吗?
  • 我们在 Win7 和 WinXP SP3 机器上遇到了这个问题。
  • 也许您应该创建一个测试应用程序并一个一个地添加您在失败的应用程序中拥有的相同组件。希望你能看到它何时失败,从而找到罪魁祸首..

标签: .net wpf startup


【解决方案1】:

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

下面预感

但是,考虑到您正在使用 100% 的 CPU 内核,这听起来很可疑。你在占用线程吗?你在使用线程池吗? .NET 程序至少需要几个空闲的 ThreadPool 线程才能运行——几年前,如果你占用 ThreadPool 中的线程(运行永无止境的循环等),并且空闲的数量线程数低于 3,系统将崩溃。如果您正在使用,您应该检查 ThreadPool 中的空闲线程数。

这只是一种预感。

总结问题

但是,我试图在下面总结您的问题。看看我是否正确:

  1. 程序将仅在 一个 核心上占用 100% 的 CPU 时间 -- 这表明只有一个线程(因为更多线程将被安排在另一个 CPU 上) -- 什么样的事情你是在对那个糟糕的 CPU 内核做这样的事情吗???!!!您是否偶尔执行 System.Threading.Thread.Sleep() 以将一些 CPU 时间返回给系统?您是否将您的进程标记为后台优先级而不是高优先级?
  2. n-1 个程序实例可以正常运行(n = 内核数)。
  3. 第 n 个程序实例将失败(n = 内核数)。
  4. 失败总是无法在 Windows UI 中打开窗口。

失败模式

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

如果您有一个空闲内核,则 Windows 进程始终可以在该内核上运行,并且您的 UI 将做出响应。一旦你把它也占用了,你可能会看到 Windows 在无响应的应用程序上检测到超时——你可能会对机器造成太大的压力,以至于 Windows 无法运行。

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

【讨论】:

    【解决方案2】:

    是的,您应该针对所有相同版本的运行时,还应该查看fusion log(.NET 加载程序试图获取正确版本的二进制文件的日志)。

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

    【讨论】:

      【解决方案3】:

      尝试剥离应用程序启动代码。如果问题甚至在初始屏幕可见之前就出现了,则说明您的代码使机器停止运行,或者 WPF 中存在问题。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多