2014-01-06 32 views
2

我收到此錯誤。這裏是代碼:錯誤:調用線程無法訪問此對象,因爲其他線程擁有它

Image image; 
    BitmapImage BmpImg; 
    MemoryStream ms; 

    public void Convert() 
    { 
     ms = new MemoryStream(); 
     image.Save(ms, ImageFormat.Jpeg); 

     BmpImg = new BitmapImage(); 
     BmpImg.BeginInit(); 
     BmpImg.StreamSource = new MemoryStream(ms.ToArray()); 
     BmpImg.EndInit(); 
    } 

    private void Btn_Click(object sender, RoutedEventArgs e) 
    {  
     Dispatcher.Invoke(new Action(() => { Image.Source = BmpImg; })); 
    } 

如何將System.Drawing.Image轉換爲BitmapImage並顯示相同的wpf?

+1

不要在UI線程以外的線程上執行此操作。 – Will

+0

另外,您不必創建另一個內存流,只需執行'ms.Position = 0;'並且您可以重新使用現有的流。 – Luaan

回答

5

BmpImg在後臺線程上創建。 您不能綁定到Image Source DP在UI線程以外的線程上創建的對象。

由於您使用的是Dispatcher,我假設您現在如何委派UI線程上的東西。

因此,所有你需要做的是通過調度放BmpImg創建於UI線程爲好。

你可以得到UI調度員這樣也 - App.Current.Dispatcher

OR

由於@Clemens的意見建議,如果你的BitmapImage實例調用Freeze(),可以跨線程訪問它。

BmpImg.Freeze() 
+4

不完全正確。它在調用'BmpImg.Freeze()'後會起作用。 – Clemens

+0

是的,但是因爲OP沒有調用'Freeze',所以我建議這個,但是我會在答案中更新。謝謝! –

+0

謝謝@Clemens。 BmpImg.Freeze()工作! +1 – Vinshi

相關問題