我宣布了一个领域:
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();
}问题是我无法改变我的图像的来源。我有个错误,比如:
InvalidOperationException未被处理,调用线程无法访问此对象,因为另一个线程拥有它。
我试着用Dispatcher.Invoke,但没有用.
Application.Current.Dispatcher.Invoke((Action)delegate
{
myImage.Source = colorBitmap;
});我在寻找一些答案,但始终没有找到和我完全一样的情况。any1能否帮助我理解如何解决这样的问题(我最近也遇到了同样的问题,但我无法调用该方法,因为其他线程拥有它)。
发布于 2012-06-27 13:14:36
您的代码有两个问题:
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
https://stackoverflow.com/questions/11226806
复制相似问题