背景工人问题

时间:2011-03-31 09:33:11

标签: c# winforms multithreading backgroundworker

我有一个课程,当点击gui的某个部分时

  

- 创建一个后台工作人员并执行以下操作

     

- 创建一个新对象(这是一个新的窗体)

     

- 在它上面调用一个获取一些数据的方法

     

- 使用该数据填充新窗体gui

问题是表单上有一个gui组件,无法从主程序线程外部创建,如果我尝试我得到错误

  

Active x ....无法实例化,因为   当前线程不在   单线程公寓。

是否有人可以提供帮助,所以我可以构建这个?

在我的工作中

2 个答案:

答案 0 :(得分:2)

不要在后台线程中创建GUI组件。使用后台线程获取和处理数据,然后在 main 线程的UI中呈现它们。我知道这很不方便,因为

  • 创建大量UI元素也可能需要花费大量时间和
  • 在UI线程中创建它们需要您将代码拆分为UI部分和数据处理部分,

但实际上没有办法解决它。 .NET UI组件不是为在后台线程中处理而设计的。

要仅在主线程中执行代码的某些操作,可以使用

  • someUIControl.Invoke(...)(WinForms)或
  • Dispatcher.Invoke(...)(WPF)

在BackgroundWorker的DoWork事件处理程序中。或者,您可以在BackgroundWorker的RunWorkerCompleted事件处理程序中执行UI操作,该处理程序始终在UI线程中执行。

答案 1 :(得分:0)

UI只应由UI线程管理。

一种可能的解决方案是使用BackgroundWorker异步加载数据,完成后使用Result的{​​{1}}属性将结果传递回UI线程然后显示新表单。