首页 > 解决方案 > 如果我不在 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 将不起作用。在这么简单的事情中,我找不到错误的来源。

标签: c#backgroundworker

解决方案


没有必要如此频繁地报告进度。

做这样的事情:

for (var i = 1; i <= 10000; i++)
{
    Thread.Sleep(1);
    if (i % 100 == 0)
    {
        worker?.ReportProgress(i);
    }
}

或者您可以检查时间或滴答计数,当您看到 50 毫秒的时间已经过去时,请执行ReportProgress. 比这更频繁地做这件事是没有意义的。

此外,您可以批量更新您的更新,GridView以使其更高效/更少浪费 - 一次发送这么多行 1 行将有更多的开销一次完成。


推荐阅读