【问题标题】:"The calling thread cannot access this object because a different thread owns it" and thread pool“调用线程无法访问此对象,因为不同的线程拥有它”和线程池
【发布时间】:2014-10-22 13:13:49
【问题描述】:

我正在使用 ThreadPool 以便同时多次运行相同的方法。 我在 MainWindow.xaml 中有一个名为 OUTPUT_Box 的 TextBox,还有一个名为 HTTP_Web 的类。 当我尝试从 HTTP_Web.cs 编辑 OUTPUT_BOX.Text 时,我得到了上述异常。到目前为止,解决方案很简单:

this.Dispatcher.Invoke((Action)(() =>
{
    OUTPUT_BOX.Text += "ALL OK";
}));

但是当我使用它时,什么也没有发生。 整个代码:

public void ThreadsPool(string arg)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(ACTION), someargument);
}

private void ACTION(object arg)
{
//.. Some code
    this.Dispatcher.Invoke((Action)(() =>
{
    OUTPUT_BOX.Text += "ALL OK";
}));
}

谢谢!

【问题讨论】:

  • 哪一行出现异常?我猜您的 //.. Some code 访问 UI,当从线程池线程调用此方法时,这是不允许的。同样从 .Net 4.0 开始,无需使用 QueueUserWorkItem,使用 TPL。假设您使用的是 .Net 4.0 或更高版本。
  • 我没有收到任何异常,没有任何反应,TextBox 没有更新。我也在为 3.5 开发。
  • 如果你放断点可能会发生一些事情然后你可以问这个问题吗?
  • 在你的问题中你说我得到了上述异常,现在你说我没有得到任何异常。哪个是真的?如果没有异常,那么此消息来自哪里调用线程无法访问此对象,因为不同的线程拥有它”和线程池
  • 我试过了,还是不行。

标签: c# .net wpf multithreading exception


【解决方案1】:

我认为您正在尝试做一些故意难以做到的事情(注意调度程序对智能感知是隐藏的)

WPF 是为处理数据绑定而编写的,因此您无需担心 UI 线程上的访问。

为此,MVVM 模式应运而生,它将应用程序拆分为不同的组件。一旦您了解了这种模式,WPF 就会变得更有意义,工作也更轻松,而且您再也不会(好吧,无论如何很少!)需要再担心 UI 线程访问!

【讨论】:

  • 那么有没有办法从 ThreadPool 方法编辑 TextBox 内容?你能想到别的吗?感谢您的支持。
  • 你正在做的应该工作。放置一些断点以查看是否调用了 ACTION,另一个查看设置 .text 的行是否也被调用
猜你喜欢
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多