【问题标题】:Updating Status Strip on Form from BackgroundWorker从 BackgroundWorker 更新表单上的状态条
【发布时间】:2018-12-13 16:50:05
【问题描述】:

我目前正在采用现有设计并重构它的某些方面。我试图将 BackgroundWorker 类包装在一个单独的对象中,并在单独的线程上调用数据导入。我唯一的问题是让 StatusStrip 对象在表单上更新。该应用程序使用反射,我在包装导入例程时考虑了这一点。到目前为止,我已经消除了所有的交叉线程。我已将用于更新表单中的 StatusStrip 的回调重定向到此包装器对象中,并且数据导入正在回调包装器。表单中有一个用于处理原始回调的方法。我只需要弄清楚如何跨线程调用更新。

异步操作部分的工作在很大程度上是由于我从 stackoverflow 中获得的信息。除了这个愚蠢的 StatusStrip 之外,所有这些都已连接起来。

【问题讨论】:

  • 或许Form.Invoke()?
  • 谢谢尼克。我没试过!这需要委托吗?
  • 另外,当我实例化它时,我在这个包装器中引用了我的主窗体。但是,令我沮丧的是,当我尝试使用包含 Form 对象的变量时,BackgroundWorker 让我很伤心。
  • 是的,它确实需要委托人。因此,您对主表单的引用并调用 Invoke,将委托传递给将更新 StatusStrip 的代码。
  • 啊哈!这是我遇到问题的部分 - 为该代表接线。它是表单中的一个事件,数据导入被传递给回调。有什么建议我可以将这个代表放在哪里以及如何将新代表与现有事件交织在一起?

标签: c# asynchronous callback


【解决方案1】:

所以,它成功了。

如果在 BackgroundWorker 包装类中被回调,我按照 Nick 的建议执行了以下操作:

private void updtStatus(object sender, EventArgs e)
    { if (MainForm.InvokeRequired)
      { MainForm.Invoke(new DoUIWorkHandler(MainForm.updtStatus), new object[] { sender, e }); }
    }

注意:MainForm.updtStatus 是表单上的原始事件,被数据导入回调以更新 StatusStrip。

我在另一个 stackoverflow 线程上发现了这个:

public delegate void DoUIWorkHandler();

而且,我在 BackgroundWorker 包装器的顶部修改了我的代码的委托:

public delegate void DoUIWorkHandler(object sender, EventArgs args);

这是我错过的代表作品!奇迹般有效!感谢您在这件事上的所有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多