背景工作者 - 调用线程无法访问对象

4

那么在我的DoWork中,我有:

List<KeyValuePair<String, BitmapImage>> Files = new List<KeyValuePair<string,BitmapImage>>((List<KeyValuePair<String, BitmapImage>>)e.Argument);

foreach (KeyValuePair<String, BitmapImage> i in Files)
{
    string temp = i.ToString();               .......(1)
    //.....
}

我将参数传递如下:-
backgroundWorkerForReupload.RunWorkerAsync(files);

“files”是List<KeyValuePair<string, BitmapImage>>类型。

在上面的第(1)行,它抛出一个InvalidOperationException,并显示以下信息:“调用线程无法访问此对象,因为另一个线程拥有它。

我困惑于为什么i被另一个线程所拥有。任何帮助将不胜感激。谢谢。


它们是如何加载的?它们被用于其他任何事情吗?最有可能的原因是它们与主UI线程有某种关联。 - toad
e.Argument 是这个值的来源。这个参数来自调用线程。因此,即使您创建了一个新的键值对列表,其中包含的数据并没有被复制,而是在另一个线程上被引用。这仍然无法解释为什么对 ToString 的线程安全调用会失败。 - Will Custode
1
@toad 原始列表正在UI线程中使用,但“Files”是在DoWork()方法中使用new关键字创建的。因此,它不应该是后台线程拥有的新副本吗? - AyushISM
1个回答

4

大多数 WPF 对象,包括 BitmapImage,都是与线程相关的,只能由它们创建的线程使用。

您可以通过先调用 Freeze() 来解决 BitmapImage 的问题。


谢谢您,先生。您的解决方案帮了我很多。实际上,我一直在这个线程上寻找这个问题的解决方案: http://stackoverflow.com/questions/23975709/invalidoperationexception-when-trying-to-access-a-complex-object-from-another-th/23979622#23979622 - Ibrahim Amer

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