代码之家  ›  专栏  ›  技术社区  ›  Priyank Bolia

BackgroundWorker仍然需要调用Invoke?

  •  2
  • Priyank Bolia  · 技术社区  · 15 年前

    最后一个问题 Display progress bar while doing some work in C#? ,人们建议使用 BackgroundWorker . 我想 背景工作者 DoWork方法可以直接更新GUI,但为什么需要使用 Invoke .

    toolTip.SetToolTip(button, toolTipText);
    
    3 回复  |  直到 15 年前
        1
  •  6
  •   Mitch Wheat    15 年前

    这个 RunWorkerCompleted 回调被编组到UI线程上; DoWork 不是。

    你应该使用 ReportProgress 更新用户界面的方法 道沃克 处理。

    见: How to: Run an Operation in the Background

        2
  •  3
  •   casperOne    15 年前

    您错了,不能直接从DoWork方法的处理程序调用UI线程,因为它在后台线程上。

    如果要更新UI,应调用ReportProgress方法,然后从ProgressChanged事件的事件处理程序更新UI。

    虽然可以在后台线程中调用invoke方法,但这样做会破坏使用BackgroundWorker类的目的。progresschanged事件在UI线程上引发,并且是在后台线程发生更改时用于更新UI组件的机制。

        3
  •  1
  •   Giorgi    15 年前

    请记住,如果从非UI线程调用runworkerasync(),则需要从ProgressChanged和runworkerCompleted事件处理程序调用invoke。