簡體   English   中英

線程無法訪問該對象

[英]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幫助我理解如何解決這樣的問題(我最近遇到了同樣的問題,但我無法調用該方法,因為其他線程擁有它)。

您的代碼有兩個問題:

  1. 您無法從另一個與創建它的線程不同的線程訪問WriteableBitmap 如果你想這樣做,你需要先通過調用WriteableBitmap.Freeze()來凍結你的位圖

  2. 您不能在不是調度程序線程的線程中訪問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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM