【发布时间】:2011-10-07 05:47:08
【问题描述】:
我在 WPF 表单和另一个类上有一个网格,其中包含一些事件。从我的 wpf 表单中,我订阅了这些事件,我希望他们将一些对象添加到我的网格中,但我只有“调用线程无法访问该对象,因为不同的线程拥有它”。如何避免此问题并获得相同的功能?
【问题讨论】:
我在 WPF 表单和另一个类上有一个网格,其中包含一些事件。从我的 wpf 表单中,我订阅了这些事件,我希望他们将一些对象添加到我的网格中,但我只有“调用线程无法访问该对象,因为不同的线程拥有它”。如何避免此问题并获得相同的功能?
【问题讨论】:
这已在 StackOverflow 和其他地方以令人作呕的方式进行了报道。您需要使用 Dispatcher 将您的访问编组回 UI 线程。例如:
private void OnSomeEvent(object sender, EventArgs e)
{
// this is being called on a thread other than the UI thread so marshal back to the UI thread
Dispatcher.BeginInvoke((ThreadStart)delegate
{
// now the grid can be accessed
grid.Whatever = foo;
});
}
【讨论】:
这是一个跨线程问题。查看委托创建,以便您可以安全地调用另一个线程来修改在不同线程上创建的内容。这是一篇很好的 MSDN 文章,介绍了如何进行这些线程安全调用。
http://msdn.microsoft.com/en-us/library/ms171728(v=vs.80).aspx
【讨论】: