2014-01-24 30 views
4

所以在我的DoWork的,我有BackgroundWorker的 - 調用線程不能訪問對象

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); 

其中 「文件」 是List<KeyValuePair<string, BitmapImage>>

類型

在上面第(1)行,它拋出一個InvalidOperationException消息:「調用線程不能訪問這個對象,因爲不同的線程擁有它

我很困惑,爲什麼i被另一個線程所擁有。任何幫助將不勝感激。謝謝。

+0

他們是如何加載的?他們是否用於其他任何事情?最可能的原因是它們以某種方式與主UI線程相關聯。 – toad

+0

'e.Argument'是來自哪裏。爭論來自調用線程。因此,儘管您正在創建一個新的鍵值對列表,但這些對中包含的數據不會被複制,而會被引用,並在另一個線程上。仍然沒有解釋爲什麼線程安全調用ToString失敗。 –

+1

@toad原始列表正在UI線程中使用,但「文件」是使用新關鍵字(在DoWork()方法中)創建的。那麼它不應該是後臺線程擁有的列表的新副本嗎? – AyushISM

回答

4

大多數WPF對象,包括BitmapImage,是線程仿射,並且只能由他們創建的線程中使用。

你可以通過調用Freeze()首先解決這個問題的BitmapImage

+0

謝謝你,你的解決方案已經幫助了我很多,其實我對於這個線程這個問題的解決方案一直在尋找: http://stackoverflow.com/questions/23975709/invalidoperationexception-when-trying-to-access-a - 配合物對象從 - 另一個/ 23979622#23979622 –

相關問題