我正在尝试正确关闭我的应用程序。我的应用程序使用数据绑定(bind),访问数据库几次,并且可能还运行了一些先天威胁。
由于 Application.Current.Shutdown()
在这种情况下没有关闭所有内容,所以我查看了 Application.Current.Dispatcher.BeginInvokeShutdown()
。
BeginInvokeShutdown()
需要一个 System.Windows.Threading.DispatcherPriority
参数。这可以是:
无效
- 枚举值为 -1。这是一个无效的优先级。Inactive
- 枚举值为 0。未处理操作。SystemIdle
- 枚举值为 1。在系统空闲时处理操作。ApplicationIdle
- 枚举值为 2。在应用程序空闲时处理操作。ContextIdle
- 枚举值为 3。在后台操作完成后处理操作。背景
- 枚举值为 4。在所有其他非空闲操作完成后处理操作。Input
- 枚举值为 5。操作的处理优先级与输入相同。Loaded
- 枚举值为 6。操作在布局和渲染完成时处理,但就在为输入优先级的项目提供服务之前。具体来说,这在引发 Loaded 事件时使用。Render
- 枚举值为 7。以与渲染相同的优先级处理操作。DataBind
- 枚举值为 8。操作的处理优先级与数据绑定(bind)相同。Normal
- 枚举值为 9。以正常优先级处理操作。这是典型的应用程序优先级。Send
- 枚举值为 10。操作在其他异步操作之前处理。这是最高优先级。
现在,假设我的应用程序仅在出现问题时关闭。这意味着应用程序无需完成任何操作,只需进行原始关闭,以便用户可以重新启动应用程序。我说我必须将 Inactive
作为参数是正确的吗?如果我将 Send
作为参数,是否在完全关闭之前一切都已完成?
最佳答案
Application.Current.Shutdown()
应该适用于您的情况,只要您的线程是后台线程。它们是如何创建的?如果您只是新建一个 Thread 对象,您应该能够将 IsBackground 属性设置为 true
。如果它们需要成为前台线程,您需要在关闭时手动停止循环。
至于你的实际问题,据我了解 BeginInvokeShutdown
仍将处理 UI 线程队列中的所有内容,但不会接受任何更多操作。优先级似乎类似于普通的线程优先级设置,因为它与 CPU 使用率相关,并且具有将调用的任务结束到处理队列前端的额外能力。
关于c# - 使用数据绑定(bind)和线程关闭 WPF 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15068667/