因为不同的线程拥有它,所以调用线程无法访问此对象

6

我在主线程中有一个WPF窗口。在这个窗口的按钮点击事件中,我正在加载数据。同时,我正在使用一个单独的线程来显示等待屏幕。但是我无法将主窗口设置为等待屏幕的父级。它会抛出以下错误:因为不同的线程拥有它,所以调用线程无法访问此对象。

3个回答

7

您需要了解 Dispatcher.Invoke 方法。


5

您可以使用BackgroundWorker类执行异步操作,它会处理可能存在的线程关联问题。使用它与连接几个事件一样简单。

这篇文章可帮助您入门。

或者您也可以使用Dispatcher.Invoke在正确的线程上执行操作:

private void DoStuffOnThread()
{
    Dispatcher.Invoke(new Action(DoStuffOnUIThread));
}

private void DoStuffOnUIThread()
{
    // ...
}

0
你遇到的问题是窗口/控件具有线程亲和性(它们由特定线程“拥有”),并且您不能在不同线程之间混合使用它们。
如果您希望等待屏幕的父窗口是主窗口,则应在主窗口的线程上创建等待屏幕。然后,在其他线程上,您可以使用Invoke告诉等待屏幕显示。
这里有一篇关于WPF跨线程操作的好文章(向下搜索Figure 4 Updating the UI):

http://msdn.microsoft.com/en-us/magazine/cc163328.aspx


我的错误,更新答案以删除WinForms相关内容。 - JohnD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接