【问题标题】:Background worker issue后台工作者问题
【发布时间】:2011-03-31 09:33:10
【问题描述】:

我有一个类,当点击 gui 的某个部分时会

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

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

-调用获取一些数据的方法

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

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

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

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

在我的工作中

【问题讨论】:

  • Mb 这个可以。 stackoverflow.com/questions/1418466/… 无论如何,在winforms中你可以实现一个委托并使用Form.Invoke方法在主线程中启动它。
  • 您的应用程序是用 WinForms 还是 WPF 编写的?

标签: c# winforms multithreading backgroundworker


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 拥有一个处理数据检索的类然后用来显示它会很愚蠢吗?然后我可以在后台工作人员中运行一个,在完成后在主线程中运行一个?如果可能的话,我应该看看任何类型的继承层次结构吗?
  • @ricki:是的,将不同的任务分成不同的类会很有用(“单一职责原则”)。在你的情况下是否有必要很难从远处回答,因为它总是取决于具体情况。我认为您的情况不需要任何特殊的继承层次结构。如果您的代码很简单,那么拥有两个函数(一个用于后台线程,另一个用于 UI 线程)可能就足够了;如果涉及更多,可能会有两个课程。
【解决方案2】:

UI 应该只由 UI 线程管理。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多