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.
这是我正在尝试执行的代码,但在逐步执行我的代码时,我从未在显示 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. SetValue
instead.