C#中BackgroundWorker的性能问题

本文关键字:性能 问题 BackgroundWorker | 更新日期: 2023-09-27 18:27:21

我对C#中的BackgroundWorker性能有一个奇怪的问题。我有一个应用程序,它使用BackgroundWorker来执行某些任务。基本任务如下:

public void simulate(Image imgSimulator)
        {
            simulador = new Simulator(imgSimulator);
            simulador.setBackground(0);
            Constants.finishSimulation = false;
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += run;
            bw.RunWorkerAsync(imgSimulator);
        }
public void run(object sender, DoWorkEventArgs e)
        {
            Image imgSimulator = (Image)e.Argument;
            bool clear;
            foreach (Program p in programs)
            {
                Resource r = p.getResource(0);
                clear = true;
                if (r is Text)
                {
                    Text t = (Text)r;
                    clear = t.getClearPrev() == 1;
                }
                if (!clear)
                {
                    simulador.setBackground(FontBitmap.COLOR_BLACK);
                }
                p.execute(simulador, imgSimulator);
                if (Constants.finishSimulation)
                {
                    break;
                }
            }
        }

上面代码中的主要功能是执行:

public void execute(Simulator simulador, System.Windows.Controls.Image imgSimulator)
        {
            long now = DateTime.Now.Ticks / 10000;
            long current = DateTime.Now.Ticks / 10000;
            while (true)
            {
                current = DateTime.Now.Ticks / 10000;
                if (current - now >= 1)
                {
                    App.Current.Dispatcher.Invoke((Action)(() =>
                    {
                        ((MainWindow)System.Windows.Application.Current.MainWindow).Title = "" + Constants.index++;
                    }));
                    now = DateTime.Now.Ticks / 10000;
                }
            }
        }

为了调试目的,我修改了execute函数,现在它更改了主窗口的标题。

问题是,在我的电脑上,应用程序运行正常,但我在另一台电脑上尝试了它,标题的更新速度不一样。

以下是一些数据(我为进行此测试而更改的唯一数据是数字10000)

如果我在电脑中更改10000到1000000,应用程序需要30秒才能达到300(在窗口标题栏中),而在另一台电脑中也会发生同样的情况。如果我在电脑中更改10000到100000,应用程序需要30秒才能达到3000(在窗口标题栏中),但在另一台电脑中,需要47秒才能达到3000

我注意到的另一件事是,如果我打开另一个C#应用程序(WPF),并将鼠标放在他们的控件上(或聚焦一个TextBox),该应用程序将正确运行(与它在我的电脑中运行的速度相同)。

我的电脑和其他电脑的唯一区别是我安装了Visual Studio 2013。

可能是什么问题?

谢谢。

C#中BackgroundWorker的性能问题

   if (current - now >= 1)

这并没有达到你所希望的效果,DateTime。现在并不是每一毫秒都更新一次。默认情况下,它每秒更新64次,每15.625毫秒更新一次。因此,您的Constants.index的增量不能超过每秒64。

但是其他进程和驱动程序可以通过调用timeBeginPeriod()来更改更新速率。例如,浏览器很容易将其更改为10毫秒,这是一个很好的数字来动画GIF。现在,您将使Constants.index每秒递增一百次。

这正是你所看到的:15.625/10*30秒=47秒。

您可以通过在提升的命令提示符下运行powercfg /energy来查看计算机上的活动速率。生成的报告显示标题"平台计时器分辨率"下的数字。

必须避免依赖更新率。