3

我声明了一个字段:

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 可以帮助我理解如何解决这样的问题(我最近遇到了同样的问题,但我无法调用该方法,因为其他线程拥有它)。

4

1 回答 1

9

您的代码有两个问题:

  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

于 2012-06-27T13:14:36.970 回答