我声明了一个字段:
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()
first
您无法访问myImage.Source
在不是调度程序线程的线程中。
这应该可以解决这两个问题:
private void doSomething()
{
// ... bla bla bla
colorBitmap = new WriteableBitmap(/* parameters */);
colorBitmap.Freeze();
Application.Current.Dispatcher.Invoke((Action)delegate
{
myImage.Source = colorBitmap;
});
}
EDIT请注意,此方法允许您在线程中的任何位置创建和更新位图。位图一旦被冻结,就无法再修改,在这种情况下,您应该将其丢弃并创建一个新的。
附带说明一下,如果您不想阻止线程更新myImage.Source
use BeginInvoke
代替Invoke
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)