BackgroundWorker 从不做任何事情?

BackgroundWorker never does anything?

这是我正在尝试执行的代码,但在逐步执行我的代码时,我从未在显示 progressbar1 的 windows 表单上看到任何指示或更新的进度。这是我第一次尝试让后台工作人员正常工作,我所拥有的只是一个带有一个按钮的 windows 表单,这就是项目中涉及的所有代码。

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    private int i = 0;

     public Form1()
    {
        InitializeComponent();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.WorkerSupportsCancellation = false;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
    }

    private void button1_Click(object sender, EventArgs e)
    {
            backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        ReadySteadyGo();
        worker.ReportProgress((i * 10));
        FinalizeAndFinish();
        worker.ReportProgress((i * 10));
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        progressBar1.Text = "Done!";
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Text = (e.ProgressPercentage.ToString() + "%");
    }

    private void ReadySteadyGo()
    {
        Thread.Sleep(100000);
    }
    private void FinalizeAndFinish()
    {
        Thread.Sleep(1000);
    }
}

我在 Visual Studio 中重新创建了您的示例,并且在 backgroundWorker1_DoWork 中遇到了断点,因此多线程工作正常,您只需要进行适当的处​​理?

    private void button1_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 1; i <= 100; i++)
        {
            backgroundWorker1.ReportProgress(i);
            Thread.Sleep(100);
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }

看来您正在使用 Thread.Sleep() 来模拟一个 long-运行 操作。根据您的代码示例,您应该考虑以下几点:

backgroundWorker1.RunWorkerAsync(); 执行时,它开始在另一个线程上工作。因此,如果您正在交互式调试并且没有在 backgroundWorker1_DoWork 方法中设置断点,则您不太可能看到此代码执行。

Thread.Sleep(100000) 执行时,这实际上意味着后台工作程序将暂停 100 秒 - 因此您需要确保至少等待那么长时间查看 UI 更新。

此外,根据 Hans Passant 的评论,请考虑以下几点:

Nor can you see it doing anything, there's no point to assigning the ProgressBar.Text property since it doesn't display text. Set Value instead.