我有一個簡單的方法調用返回bitmap
圖像的函數。無法從WPF中的其他線程更新UI
private void ImageToGrayScale(object sender, RoutedEventArgs e)
{
pbStatus.Visibility = Visibility.Visible;
if (loadedImage != null)
{
new Thread(() =>
{
BitmapImage bitmapImage= ThreadProcedure();
this.Dispatcher.Invoke(new Action(()=> {
pbStatus.Visibility = Visibility.Hidden;
EditedImage.Source = bitmapImage;
}));
}).Start();
}
else
{
MessageBox.Show("Please select the image first!");
}
}
每次在一行:EditedImage.Source = bitmapImage;
一個得到一個錯誤:
The calling thread cannot access this object because a different thread owns it.
另外,這裏是它返回一個bitmap
圖像的方法。
private BitmapImage ThreadProcedure()
{
Bitmap editedImage = new Bitmap(loadedImage);
for (int x = 0; x < editedImage.Width; x++)
{
for (int y = 0; y < editedImage.Height; y++)
{
Color pixelColor = editedImage.GetPixel(x, y);
int rgb = (int)((pixelColor.R + pixelColor.G + pixelColor.B)/3);
editedImage.SetPixel(x, y, Color.FromArgb(rgb, rgb, rgb)); // Now greyscale
}
}
return Converter.ConvertBitmapToBitmapImage(editedImage, extension);
}
什麼是loadedImage,是這個問題嗎?您可以在線程過程中從中創建新的位圖。或者,您可能應該將bitmapImage作爲參數傳遞給調度程序委託... – japesu
此處的問題很可能與'bitmapImage'對象有關 - 它是在與Dispatcher同步上下文不同的線程上創建的。因此,從它讀取,並將其複製到源可能會因此錯誤而失敗。爲了測試這個,將調用移動到調度程序調用中的'ThreadProcedure'並查看它是否工作。 – Baldrick
@Baldrick,它的工作原理,但它阻止了UI線程和它沒有響應的窗口。 –