检查取消时发送背景工作人员睡觉

Dam*_*amo 5 c# wpf multithreading backgroundworker

我有一个后台工作者,通过ReportProgress定期更新GUI.

更新定期发生,例如每5秒一次,或者可能是20秒.为了在设定的时间执行更新,我将工作进程发送到休眠状态一段时间,当它唤醒时,它会使用新信息更新GUI.

工作人员支持取消,在睡觉之外取消正确.

我希望能够在等待期间调用取消,但是将线程发送到睡眠状态会使这变得不可能.

我假设我将不得不调用一个循环并检查取消作为循环的一部分来模拟线程睡眠.

实现这一目标的最佳方法是什么,我的尝试完全取消了.

            long counter = 0;
            long sleepfor = timelinespeed*1000;
            int timelinespeed = 10;

                while (counter != sleepfor)
                {

                    Thread.Sleep(1);

                    counter++;

                    if (bkgwk.CancellationPending)
                    {
                        cancelled = true;
                        e.Cancel = true;
                        bkgwk.Dispose();
                        break;
                    }

                }
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 15

你走错了路.

  • Bgw正在使用ThreadPool,因此应该用于(相对)短的动作,通常在0.5秒内.不建议无限期地保持一个人.
  • 你几乎不应该Sleep()在任何线程上使用.当然不会超过几毫秒.
  • 使用Sleep(1)在忙等待5秒CPU是一个巨大的浪费.你正在伤害你的其他线程.至少考虑将其提升到Sleep(100)左右.找到允许取消的最大延迟.

作为解决方案:使用计时器.你有一个周期性的任务,使用正确的工具.

使用System.Threading.Timer基于线程池后台工作.通过Dispatcher.Invoke()更新GUI.

使用在Dispatcher.Timer主线程上执行小的(小于0.1秒)部分工作.您可以直接更新GUI.