我宣佈一個字段對象:線程不能訪問
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;
});
我正在尋找一些答案,但從來沒有發現的情況下完全按照我的。任何1可以幫助我理解如何解決這樣的問題(我最近有同樣的問題,但我無法調用該方法,因爲其他線程擁有它)。
好了,從我的頭頂,我想這是WPF或Silverlight?如果我記得正確(我很少這麼做!),你不能在後臺線程上實例化一個新的'WriteableBitmap'(出於某種愚蠢的原因)。不知道爲什麼它調度到主線程後不起作用。也許嘗試'myImage.Dispatcher.Invoke'而不是'Application.Current.Displatcher.Invoke'? –
例如,請參閱http://stackoverflow.com/questions/1855308/asynchronous-operations-on-writeablebitmap。這是一個特殊情況 - 如果你看到文檔http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap.aspx,那麼解釋是'當更新發送到渲染線程渲染線程將已更改的矩形從後臺緩衝區複製到前臺緩衝區。渲染系統控制此交換以避免死鎖和重繪工件,例如「撕裂」。 – dash
myImage.Dispatcher.Invoke - 同樣的錯誤 – Nickon