我正在构建一个 WPF 应用程序。我正在与服务器端进行一些异步通信,并在客户端使用事件聚合和 Prism。这两件事都会导致生成不是 UI 线程的新线程。如果我尝试在这些回调和事件处理程序线程上执行“WPF 操作”,那么世界将分崩离析,现在它已经开始这样做了。
首先,我在尝试从服务器的回调中创建一些 WPF 对象时遇到了问题。有人告诉我线程需要在 STA 模式下运行。现在我正在尝试更新 Prism 事件处理程序中的一些 UI 数据,我被告知:
调用者无法访问该线程,因为另一个线程拥有它。
所以; 在 WPF 中做正确的事情的关键是什么?我已经阅读了这篇 MSDN 帖子中的 WPF Dispatcher 。我开始明白了,但我还不是巫师。
- 当我需要运行一些我不确定是否会在 UI 线程上调用的东西时,总是使用 Dispatcher.Invoke 的关键是什么?
- 如果它实际上是在 UI 线程上调用的,并且无论如何我都执行 Dispatcher.Invoke,这有关系吗?
- Dispatcher.Invoke = 同步。Dispathcher.BeginInvoke = 异步?
- Dispatcher.Invoke 会请求 UI 线程,然后停止等待吗?响应速度较慢的程序是不好的做法和风险吗?
- 无论如何,我如何获得调度员?Dispatcher.CurrentDispatcher 是否总是给我代表 UI 线程的调度程序?
- 是否会存在多个 Dispatcher,或者“Dispatcher”是否与应用程序的 UI 线程基本相同?
- BackgroundWorker 是怎么回事?我什么时候改用这个?我认为这总是异步的?
- 在 UI 线程上运行的所有内容(通过被调用)是否会在 STA 单元模式下运行?即,如果我有一些需要在 STA 模式下运行的东西 - Dispatcher.Invoke 就足够了吗?
有人想为我澄清事情吗?有没有相关推荐之类的?谢谢!