当前位置:  开发笔记 > 编程语言 > 正文

C#中BackgroundWorker的性能问题

如何解决《C#中BackgroundWorker的性能问题》经验,为你挑选了1个好方法。

我对C#中的BackgroundWorker性能有一个奇怪的问题.我有一个应用程序,除其他外,使用BackgroundWorker来执行某些任务.Basicaly的任务如下:

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;
                }
            }

        }

上面代码中的主要函数是execute:

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;
                }
            }
        }

我已经修改了执行函数来调试目的,现在它改变了主窗口标题.

问题是,在我的电脑中,应用程序运行正常,但我在另一台电脑上尝试过,标题不会以相同的速度更新.

这里有一些数据(我做过这项测试的唯一变化就是数字10000)

如果我在我的电脑中将10000更改为1000000,则应用程序需要30秒才能达到300(在窗口标题栏中),并且在其他电脑中也会发生相同情况.如果我在我的电脑中将10000改为100000,则应用程序需要30秒才能达到3000(在窗口标题栏中),但在另一台电脑中需要47秒才能达到3000

我注意到的另一件事是,如果我打开另一个C#应用程序(WPF)并将鼠标移到其控件上(或聚焦TextBox),则应用程序可以正常运行(速度与我在PC中运行的速度相同).

我的电脑和另一个的唯一区别是我安装了Visual Studio 2013.

可能是什么问题呢?

谢谢.



1> Hans Passant..:
   if (current - now >= 1)

这不符合您的期望,DateTime.Now不会每毫秒更新一次.默认情况下,它每秒更新64次,每15.625毫秒更新一次.所以你的Constants.index每秒增量不能超过64.

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

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

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

必须避免依赖更新速率.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有