C#后台 worker 更新状态标签

标签 c# winforms label backgroundworker

这应该是一件相当简单的事情;但是,我一直无法弄清楚这一点。

/// This section is located in the InitializeComponent() method
/// form's class, i.e. partial class frmMain { .... }
this.bgw = new System.ComponentModel.BackgroundWorker();
this.bgw.WorkerReportsProgress = true;
this.bgw.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgw_DoWork);
this.bgw.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgw_ProgressChanged);

/// This code is located in public partial class frmMain : Form { .... }
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
        Thread.Sleep(100); // Wait 100 milliseconds
        //Console.WriteLine(i);
        bgw.ReportProgress(i);
    }
}
private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // Update status label
    lblStatus.Text = e.ProgressPercentage.ToString();
}
// New code added to question after edit
public frmMain()
{
    InitializeComponent();
    bgw.RunWorkerAsync();
    // some more stuff...
}

后台worker运行正常;但是,它没有正确更新其进度。如果我取消注释 DoWork 事件中的注释行,我能够看到正确更新的状态;但是,直到主线程中的任务(繁重的数据库计算内容)完成后,ProgressChanged 事件才会被触发。

这是一个使用 .NET Framework 4 的 Windows 窗体应用程序。

编辑

代码所在位置见上面代码中的注释

更多细节

正在执行的代码涉及对数据库执行多个查询。我无权公开该代码。至于该代码是如何执行的,我实际上并不知道,因为我被另一个开发人员交给了一个 .dll,并被告知只在访问数据库时使用它....

编辑

将“更多内容”部分中的代码移动如下

private void frmMain_Load(object sender, EventArgs e)
{
   // some more stuff... aka run queries!
}

最佳答案

您的 BackgroundWorker 代码没问题。问题是您在其他地方(在本例中,在您的构造函数或 FormLoad 中)有代码阻塞了 UI 线程(通过执行同步数据库请求)。您需要做一些事情来确保此代码在非 UI 线程中运行。这可能意味着使用这个现有的 BackgroundWorker 来执行其他长时间运行的任务;它也可以通过使用 Task.Factory.StartNew 或一些其他线程机制让它在非 UI 线程中运行来完成。

一旦 UI 线程未被阻止,您将看到在 `ProgressChanged 事件处理程序中所做的更新反射(reflect)在 UI 中。

关于C#后台 worker 更新状态标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12044421/

相关文章:

c# - 如何将文本格式传递给 .cs 文件?

c# - 可以自动将元素添加到集合中吗?

wpf - WPF 中与 ControlPaint.Light 等效的是什么?

.net - VB.NET中捕获功能键F1..F12

html - 尽管 for=id,但单击标签不会聚焦输入

twitter-bootstrap - 如何在Bootstrap中设置标签大小

c# - 由于 DataGridViewImageColumn,DataGridView 在默认错误对话框中抛出异常

c# - 从 Azman 获取属于角色的任务列表

c# - 将数据从服务器发送回客户端

javascript - 如何在不干扰标签内的输入 radio 的情况下更改标签文本?