[英]Thread cannot access the object
我宣布了一個字段:
WriteableBitmap colorBitmap;
然后我創建了一個簡單的線程來執行某些操作
private void doSomething()
{
// ... bla bla bla
colorBitmap = new WriteableBitmap(/* parameters */);
myImage.Source = colorBitmap; // error here:S
}
在Windows_Loaded事件中,我聲明並啟動了一個新線程:
private void window_Loaded(object sender, RoutedEventArgs e)
{
Thread th = new Thread(new ThreadStart(doSomething));
th.Start();
}
問題是我無法改變myImage的來源。 我有一個錯誤,如:
InvalidOperationException未處理調用線程無法訪問此對象,因為另一個線程擁有它。
我試圖使用Dispatcher.Invoke,但它沒有幫助...
Application.Current.Dispatcher.Invoke((Action)delegate
{
myImage.Source = colorBitmap;
});
我正在尋找一些答案,但從來沒有像我一樣找到這個案子。 any1幫助我理解如何解決這樣的問題(我最近遇到了同樣的問題,但我無法調用該方法,因為其他線程擁有它)。
您的代碼有兩個問題:
您無法從另一個與創建它的線程不同的線程訪問WriteableBitmap
。 如果你想這樣做,你需要先通過調用WriteableBitmap.Freeze()
來凍結你的位圖
您不能在不是調度程序線程的線程中訪問myImage.Source
。
這應該解決這兩個問題:
private void doSomething()
{
// ... bla bla bla
colorBitmap = new WriteableBitmap(/* parameters */);
colorBitmap.Freeze();
Application.Current.Dispatcher.Invoke((Action)delegate
{
myImage.Source = colorBitmap;
});
}
編輯請注意,此方法允許您在線程中的任何位置創建和更新位圖。 一旦位圖被凍結,就不能再修改它,在這種情況下你應該刪除它並創建一個新位圖。
另外,如果您不希望阻止線程更新myImage.Source
使用BeginInvoke
而不是Invoke
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.