c# - 如果我不在 WinForms 上使用 Thread.Sleep,BackgroundWorker 将不起作用
问题描述
这是我的简单代码:
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
以使其更高效/更少浪费 - 一次发送这么多行 1 行将有更多的开销一次完成。
推荐阅读
- python - 在python中使用for循环将多个列表合并为一个列表
- php - Laravel HTML 无法正确显示
- azure-devops - 在 Azure DevOps 中构建 NuGet 后更新 packages.config
- python - 如何解决 Python 中的 Google Sheet API 错误
- laravel - laravel dompdf 未定义类型 'PDF'
- mysql - django 设置文件中的数据库选项不起作用
- ceph - cephadm:无法将节点添加到 ceph 集群(错误 EINVAL:无法连接到主机)
- javascript - 如何让浏览器检测输入字段值的变化?
- ios - 自定义 tabview 标题栏
- wordpress - 重力形式:在元框中打印条目信息(不只是默认布局显示)