【问题标题】:Can I fire an event directly from BackgroundWorker's DoWork handler?我可以直接从 BackgroundWorker 的 DoWork 处理程序触发事件吗?
【发布时间】:2009-04-30 00:41:18
【问题描述】:

我是第一次使用BackgroundWorker,使用还不完全清楚。我可以直接从 DoWork 处理程序发送事件,还是我必须改为调用 ReportEvents 并从 ProgressChanged 处理程序发送事件?

【问题讨论】:

    标签: .net winforms multithreading


    【解决方案1】:

    虽然在技术上可以从 DoWork 中引发事件并使用 UI,但您必须像在任何其他线程中一样(通过使用 Invoke()BeginInvoke() 进行 UI 交互,或其他跨线程操作的正确线程同步),这将破坏BackgroundWorker 的目的。

    更好的选择是调用ReportProgress(),然后以线程安全的方式引发ProgressChanged 事件。你传递了一个int,代表完成的百分比(尽管你可以用它来做一些事情),并且,可选地,任何object,你需要获取有关事件或进度的特定信息。在 ProgressChanged 中,您可以与 UI 交互、引发事件等。

    【讨论】:

    • 作为一项规则,您永远不应该从任何其他线程与 UI 线程对话。你会得到很难调试的副作用。只是不要这样做。正如亚当所说,更好的选择是调用 ReportProgress。
    【解决方案2】:

    只需将其添加到代码中即可。

    void new control.CheckForIllegelCrossPathThreads == false;
    

    【讨论】:

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