【问题标题】:Is the BackgroundWorker Completed event performed in background?BackgroundWorker Completed 事件是否在后台执行?
【发布时间】:2013-11-27 20:49:01
【问题描述】:

假设,我像这样创建BackgroundWorker

private void RunBackgroundWorker(object sender, DoWorkEventArgs e)
{
    //  Do something lengthy here
    // which takes a lot of time
}
private void BackgroundWorkerCompleted(object sender, RunWorkerCompletedEventArgs)
{
     System.Threading.Thread.Sleep(2000) ; 
     BackgroundWorker1.RunWorkerAsync() ; 
}

我想问一下BackgroundWorkerCompleted函数的内容是在“后台”线程还是主UI线程上执行的。我问这个是因为,我正在创建一个桌面应用程序,它使用数据库并在每隔几秒后不断更新它的数据库

【问题讨论】:

  • 使用 async/await 怎么样?
  • 你为什么不运行它并找出答案。毕竟你有代码。
  • 如果你想每 2 秒运行一次代码,你应该使用 Timer,而不是 BackgroundWorker。

标签: c# .net backgroundworker


【解决方案1】:

它在 UI 线程上执行。 MSDN 解释:

您必须小心不要在 DoWork 事件处理程序中操纵任何用户界面对象。相反,通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。

也就是说,Servy 在 cmets 中是正确的——您应该使用 Timer 在间隔上执行代码,不是 BackgroundWorker

【讨论】:

  • 如果进程较长,则应将其放入 BackgroundWorker 以防止 UI 冻结。
  • @RickHodder RunWorkerCompleted 事件不适用于长期运行的进程——它用于使用长期运行的进程的结果更新 UI。
【解决方案2】:

我经常使用BackgroundWorker,可以看出RunWorkerCompleted 事件肯定在 UI 线程中运行。此外,您可以将 DoWork 结果传递给相应的 eventArgs 字段,然后在 RunWorkerCompleted 中将其从 eventArgs 中取出以执行一些与 UI 相关的操作,如 here 所述

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    相关资源
    最近更新 更多