2010-01-28 98 views
1

说我有两个用户控件,UC1和UC2。用户在UC1中选择一些内容,这需要一些时间,因此该过程被关闭。 UC2需要在UC1完成时更新其视图并在另一个线程上完成自己的一些工作。但UC2依赖于UC1后台线程的输出,所以它必须等到该线程完成后才开始。WPF线程问题

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

最好的办法是做什么?我试过把它们线程化,然后从UC1的线程发出一条消息,但是然后UC2无法修改它的ObservableCollection,因为它不在正确的线程上 - 它认为它在UC1的线程上。

我是否需要将消息事件从UC1发送到UC2,这是否安全?

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

回答

2

两个UserControls应该位于同一个线程上。这就是WPF的设计。由于UC2取决于UC1也依赖于的事件,所以我会让UC1规定事件的生命周期,并在工作完成时将消息发送给UC2,或者让UC2订阅ObservableCollectionCollectionChanged事件。它们都生活在同一个UI线程中,所以它们之间的编组不需要,只需要将后台线程编组到相应的UserControl即可。

+0

不,尽管UC1和UC2都在同一个UI线程上,但如果在UC1中,您启动了一个新的后台进程线程来执行工作 - 它是UC1和UC2都不在线的新线程。如果您从UC2启动的该线程中发出消息,则消息事件仍在该后台线程中,因此您无法对您的可观察集合进行任何操作。这就是我认为你必须将后台线程放回UI线程,然后让UC2完成其工作的地方。 – Nicros 2010-01-28 21:36:25

+0

哎呀抱歉,错过了最后一句 - 我想问题是如何将来自我的BackgroundWorker线程的消息编组到接收消息的用户控件的UI线程上? – Nicros 2010-01-28 21:59:22

+0

任务完成! 使用BackgroundWorker是关键,因为任何RunWorkerCompleted事件处理程序都会自动返回到UI线程(在我的情况中)。凉。 – Nicros 2010-01-28 22:31:50