首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >线程无法访问对象。

线程无法访问对象。
EN

Stack Overflow用户
提问于 2012-06-27 13:00:50
回答 1查看 1.7K关注 0票数 3

我宣布了一个领域:

代码语言:javascript
运行
复制
WriteableBitmap colorBitmap;

然后我创建了一个简单的线程来做一些事情:

代码语言:javascript
运行
复制
private void doSomething()
{
    // ... bla bla bla
    colorBitmap = new WriteableBitmap(/* parameters */);
    myImage.Source = colorBitmap; // error here:S
}

在Windows_Loaded事件中,我声明并启动了一个新线程:

代码语言:javascript
运行
复制
private void window_Loaded(object sender, RoutedEventArgs e)
{
    Thread th = new Thread(new ThreadStart(doSomething));
    th.Start();
}

问题是我无法改变我的图像的来源。我有个错误,比如:

InvalidOperationException未被处理,调用线程无法访问此对象,因为另一个线程拥有它。

我试着用Dispatcher.Invoke,但没有用.

代码语言:javascript
运行
复制
Application.Current.Dispatcher.Invoke((Action)delegate
{
    myImage.Source = colorBitmap;
});

我在寻找一些答案,但始终没有找到和我完全一样的情况。any1能否帮助我理解如何解决这样的问题(我最近也遇到了同样的问题,但我无法调用该方法,因为其他线程拥有它)。

EN

Stack Overflow用户

回答已采纳

发布于 2012-06-27 13:14:36

您的代码有两个问题:

  1. 您不能从与创建它的线程不同的另一个线程访问WriteableBitmap。如果要这样做,则需要首先调用WriteableBitmap.Freeze()来冻结位图。
  2. 不能在不是dispatcher线程的线程中访问myImage.Source

这应该可以解决这两个问题:

代码语言:javascript
运行
复制
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

票数 9
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11226806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档