2013-02-25 60 views
3

我试图正常关闭我的应用程序。我的应用程序使用数据绑定,访问数据库几次,并可能有一些先天的威胁运行。使用数据绑定和线程关闭WPF应用程序

由于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.操作在布局和渲染完成时处理,但在处理输入优先级的项目之前处理。具体来说,这在提升Loaded事件时使用。
  • Render - 枚举值为7.以与渲染相同的优先级处理的操作。
  • DataBind - 枚举值为8.操作的处理优先级与数据绑定相同。
  • Normal - 枚举值是9.操作按正常优先级处理。这是典型的应用优先级。
  • Send - 枚举值为10.在其他异步操作之前处理操作。这是最高优先级。

现在,假设我的应用程序只在出现问题时才关闭。这意味着应用程序无需完成任何操作,只需要进行原始关闭,以便用户可以重新启动应用程序。我是否正确地说我必须给Inactive作为参数?如果我将Send作为参数,是否属实,在完全关闭之前一切都已完成?

回答

1

Application.Current.Shutdown()只要你的线程是后台线程就应该在你的情况下工作。他们是如何创建的?如果你只是新建一个Thread对象,你应该可以将IsBackground属性设置为true。如果他们需要成为前台线程,则在关闭时需要手动停止循环。

至于从我的理解BeginInvokeShutdown仍然会处理UI线程队列中的所有内容,但不会接受任何更多操作。优先级似乎与普通线程优先级设置类似,因为它与CPU使用率有关,并具有将被调用任务结束到处理队列前端的额外功能。

+0

因此,当我想关闭我的应用程序和它的所有线程时,我必须手动将每个属性设置为'isBackground'?没有其他办法了? – Joetjah 2013-02-27 10:17:51

+0

您不能将现有的线程作为后台线程。它必须在启动之前设置。你现在怎么创建你的线程?如果您使用线程池方法,则可以将它们全部默认为后台线程。如果他们长时间运行(这可能是保持应用程序活跃的更可能的原因),那么我们大概有多少人在谈论? – JRoughan 2013-02-27 22:20:47

+0

我在很多地方都有线程运行,我在通过整个解决方案进行搜索时会注意到。我将不得不将它们全部改写为Backgroudn线程。这将如何影响我的表现?我认为我的问题尽可能回答,谢谢。 – Joetjah 2013-02-28 08:35:35