如果我不在 WinForms 上使用 Thread.Sleep,BackgroundWorker 将无法工作
BackgroundWorker isn't working if I don't use Thread.Sleep on WinForms
这是我的简单代码:
private void button1_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy) return;
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
var worker = sender as BackgroundWorker;
for (var i = 1; i <= 10000; i++)
{
Thread.Sleep(1);
worker?.ReportProgress(i);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label1.Text = e.ProgressPercentage.ToString();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
label1.Text = "Completed.";
}
这段代码工作正常。但是如果我从代码中删除 Thread.Sleep(1);
,BackgroundWorker 将不起作用。这么简单的事情我都找不到哪里出错了
没必要这么频繁的汇报进度
做这样的事情:
for (var i = 1; i <= 10000; i++)
{
Thread.Sleep(1);
if (i % 100 == 0)
{
worker?.ReportProgress(i);
}
}
或者您可以检查时间或滴答计数,当您看到 50 毫秒的时间过去时,然后执行 ReportProgress
。没有必要经常这样做。
此外,您可以对 GridView
的更新进行批处理,以使其更加浪费 efficient/less - 一次发送这么多行一行会产生更多的开销时间.
这是我的简单代码:
private void button1_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy) return;
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
var worker = sender as BackgroundWorker;
for (var i = 1; i <= 10000; i++)
{
Thread.Sleep(1);
worker?.ReportProgress(i);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label1.Text = e.ProgressPercentage.ToString();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
label1.Text = "Completed.";
}
这段代码工作正常。但是如果我从代码中删除 Thread.Sleep(1);
,BackgroundWorker 将不起作用。这么简单的事情我都找不到哪里出错了
没必要这么频繁的汇报进度
做这样的事情:
for (var i = 1; i <= 10000; i++)
{
Thread.Sleep(1);
if (i % 100 == 0)
{
worker?.ReportProgress(i);
}
}
或者您可以检查时间或滴答计数,当您看到 50 毫秒的时间过去时,然后执行 ReportProgress
。没有必要经常这样做。
此外,您可以对 GridView
的更新进行批处理,以使其更加浪费 efficient/less - 一次发送这么多行一行会产生更多的开销时间.