使用数据绑定和线程关闭WPF应用程序

3
我正试图正确关闭我的应用程序。我的应用程序使用数据绑定,多次访问数据库,并可能运行一些内在的威胁。
由于在这种情况下Application.Current.Shutdown()无法关闭所有内容,我看了看Application.Current.Dispatcher.BeginInvokeShutdown()BeginInvokeShutdown()需要一个System.Windows.Threading.DispatcherPriority参数。这可以是:
- Invalid - 枚举值为-1。这是无效的优先级。 - Inactive - 枚举值为0.操作不被处理。 - SystemIdle - 枚举值为1.当系统空闲时处理操作。 - ApplicationIdle - 枚举值为2.当应用程序处于空闲状态时处理操作。 - ContextIdle - 枚举值为3.在后台操作完成后处理操作。 - Background - 枚举值为4.在所有其他非空闲操作完成后处理操作。 - Input - 枚举值为5.与输入具有相同的优先级处理操作。 - Loaded - 枚举值为6.在布局和呈现完成后但在处理输入优先级项目之前处理操作。具体来说,这是在引发“加载”事件时使用的。 - Render - 枚举值为7.与呈现具有相同优先级的操作处理。 - DataBind - 枚举值为8.与数据绑定具有相同优先级的操作处理。 - Normal - 枚举值为9.以正常优先级处理操作。这是典型的应用程序优先级。 - Send - 枚举值为10.在其他异步操作之前处理操作。这是最高优先级。
现在,假设我的应用程序只有在出现问题时才会关闭。这意味着应用程序不必完成任何操作,只需原始关闭,以便用户可以重新启动应用程序。我是否正确地说,我必须将Inactive作为参数给出?如果我将Send作为参数给出,是否所有内容都在完全关闭之前完成?
1个回答

1

Application.Current.Shutdown()应该适用于您的情况,只要您的线程是后台线程。它们是如何创建的?如果您只是新建了一个Thread对象,您应该能够将IsBackground属性设置为true。如果它们需要成为前台线程,则需要在关闭时手动停止循环。

至于您实际的问题,据我所知,BeginInvokeShutdown仍将处理UI线程队列中的所有内容,但不会接受任何其他操作。优先级似乎类似于正常线程优先级设置,与CPU使用率有关,并具有将调用任务结束到处理队列的前面的额外功能。


那么,当我想关闭我的应用程序及其所有线程时,我必须手动将每个属性设置为 isBackground 吗?没有其他方法吗? - Joetjah
你不能将现有的线程设置为后台线程,必须在启动它们之前进行设置。你现在是如何创建你的线程的?如果你正在使用线程池方法,你可以将它们全部默认为后台线程。如果它们是长时间运行的(这可能是保持应用程序活动的更可能原因),那么大约有多少个线程? - JRoughan
我在很多地方都有线程运行,当我搜索整个解决方案时会注意到。我将不得不重写它们,以创建它们作为后台线程。这会对我的性能产生什么影响?我认为我的问题已经得到了尽可能的回答,谢谢。 - Joetjah
1
我不相信它会影响性能。IsBackground属性只是一个指示器,表示线程是非必要的并且可以被终止。您仍然可以像通常一样设置优先级。 - JRoughan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接