【问题标题】:How to avoid WPF Application not Responding when logging off注销时如何避免WPF应用程序不响应
【发布时间】:2015-03-04 22:17:25
【问题描述】:

在我的 WPF 应用程序运行时尝试按下标准 Windows 7 注销按钮时,我收到“此程序正在阻止 Windows 注销”。我想强制它关闭而不必按“强制注销”。

同样,在(应用程序)任务管理器中按“结束任务”会导致它变得无响应,而不仅仅是关闭程序。

我已尝试将其添加到 Window_Closing,但似乎没有这样做:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    Environment.Exit(0);
}

我是 WPF 新手,但在我看来,窗口没有正确关闭。执行Windows注销时如何防止“程序正在阻止Windows注销”,或者从任务管理器中杀死它时“程序没有响应”?

【问题讨论】:

  • 你可能在用前台线程做一些恶作剧。
  • 您能详细说明一下吗?我不确定这是什么意思
  • 您可能经常在 ui 线程而不是工作线程上执行计算密集型任务,这会阻止应用程序及时响应操作系统。

标签: c# wpf windows-7 .net-4.0


【解决方案1】:

只有当您的应用程序没有响应从 Windows 发送的关闭事件时,这才是一个问题。

如果您在 UI 线程上执行代码,这通常会发生这种情况,这会阻止它响应消息。因此,在结束事件和类似事件中添加一些内容不会产生任何效果,因为在您的“工作”完成之前它们将无法处理。

处理此问题的正确方法是将您的工作转移到后台线程上。这使应用程序保持响应,使其能够响应来自 Windows 的关闭请求。

【讨论】:

  • 我认为这对我来说很有意义。我的程序正在做大量的数据库工作。我最初是使用 winforms 开发的,并且作为我的第一个 WPF 项目,我将所有类复制到 WPF 中并创建了一些调度计时器。因此,根据您所写的,开发 WPF 应用程序的正确方法是在 UI 之外的单独线程上完成所有工作?
  • @AlexB 是的,尽管在 Windows 窗体中也是如此。如果你在那里的主线程中这样做,你会遇到同样的问题。
  • 在 UI 线程上运行的 4 个独立的调度程序计时器上运行大量数据库函数和其他后台工作是否可以?
  • @AlexB 这会导致他们锁定 UI,并做出这种行为。
猜你喜欢
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
相关资源
最近更新 更多