【问题标题】:WPF Threading questionWPF线程问题
【发布时间】:2010-01-28 21:05:34
【问题描述】:

假设我有两个用户控件,UC1 和 UC2。用户在 UC1 中选择了一些东西,这需要一些时间,因此进程被线程化了。当 UC1 完成时,UC2 需要更新它的视图并在另一个线程上做一些自己的工作。但是 UC2 依赖于 UC1 后台线程的输出,因此它必须等到该线程完成后才能开始。

UC1 需要更新 ObservableCollection 以在其后台线程完成时更新其视图,就像 UC1 一样,异步。

最好的方法是什么?我已经尝试将它们关闭并从 UC1 的线程中触发一条消息,但随后 UC2 无法修改其 ObservableCollection,因为它不在正确的线程上 - 它认为它在 UC1 的线程上。

我需要将消息事件从 UC1 编组到 UC2,这样安全吗?

人们通常如何处理这个问题?

【问题讨论】:

    标签: c# wpf multithreading


    【解决方案1】:

    两个 UserControl 应该在同一个线程上。这就是 WPF 的设计方式。

    由于 UC2 依赖于 UC1 也依赖的事件,我会让 UC1 确定事件的生命周期,并在工作完成后将消息发送给 UC2,或者让 UC2 订阅 ObservableCollection's CollectionChanged 事件。它们都存在于同一个 UI 线程上,因此不需要在它们之间进行编组,您只需将后台线程编组到各自的 UserControl

    【讨论】:

    • 不,虽然 UC1 和 UC2 都在同一个 UI 线程上,但如果在 UC1 中启动一个新的后台进程线程来完成工作 - 它是一个 UC1 和 UC2 都不在的新线程。如果您从该线程触发 UC2 接收的消息,则消息事件仍在该后台线程上,因此您无法对 observablecollections 执行任何操作。这就是我认为您必须将后台线程编组回 UI 线程,然后让 UC2 完成工作的地方。
    • 抱歉,错过了最后一句话——我想问题是如何将来自 BackgroundWorker 线程的消息编组到接收消息的用户控件的 UI 线程?
    • 任务完成!使用 BackgroundWorker 是关键,因为任何 RunWorkerCompleted 事件处理程序都会自动返回 UI 线程(在我的情况下)。酷。
    • @Nicros - 很高兴你找到了正确的道路。 BackgroundWorker 是一个很棒的组件,专门为此而生。但是,您并不绝对需要它,您可以自己从工作线程执行编组,方法是使用 UC Dispatcher 将事件从后台线程发送到 UI 线程。这基本上就是 BackgroundWorker 所做的。
    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多