2014-02-13 31 views
1

我想获取WPF应用程序中的当前调度程序。我想要调度程序的代码位于.cs类文件(常规C#类)中。 Application.Current.Dispatcher.Invoke()和其他....Current.Dispatcher.Invoke()不可用。如何在WPF应用程序的任何地方获取调度程序

有没有办法做到这一点?

+3

听起来像你正试图让业务类调用到你的UI线程。这总是会有问题。 – Gusdor

+0

@Gusdor:如果这是设计,可以让业务对象调用GUI。缓慢的任务应该在不同的线程上完成以保持响应;如果这些类是在不同的程序集中定义的,那很好,只需将presentationframework添加到引用。也调用BeginInvoke,因为您的线程在继续之前不必等待呼叫完成。 – Dean

+0

@Dean感谢您的建议,但我恭敬地不同意。如果业务代码绝对需要序列化到UI线程或任何执行队列,我会让它知道'SynchronizationContext'的一个实例。业务对象永远不应该意识到UI框架。你将如何单元测试没有'Application'初始化的代码?如果您想在桌面应用程序中使用该程序集并且需要Web服务,该怎么办?因为你没有学会使用TPL,所以你会在重构中屈膝。 – Gusdor

回答

3

为什么类Application.Current.Dispatcher不可用?你有没有引用到PresentationFramework程序集?

0

您可以从窗口或当前窗口得到调度..

Application.Current.MainWindow.Dispatcher.Invoke() 
0

我觉得System.Windows.Threading.Dispatcher.CurrentDispatcher应该做的工作,但你应该知道,调度你会接收取决于您从中调用此方法的线程。在这里你可以看到非常好的解释,两者之间的确切区别是什么 - Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher

我的直觉告诉我,Application.Current.Dispatcher永远不会改变,是全球性的,以当前应用程序的所有线程,而Dispatcher.CurrentDispatcher可能因从调用它的线程上创建调度的新实例。

这就是为什么我会建议你找到一种方法,抽象Application.Current.Dispatcher或某些观点的调度,并通过这种抽象访问它 - 它只是对多线程的情况下更安全。

相关问题