我对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.
可能是什么问题呢?
谢谢.
if (current - now >= 1)
这不符合您的期望,DateTime.Now不会每毫秒更新一次.默认情况下,它每秒更新64次,每15.625毫秒更新一次.所以你的Constants.index每秒增量不能超过64.
但是其他进程和驱动程序可以通过调用timeBeginPeriod()来更改该更新速率.浏览器很容易将其更改为10毫秒,例如,为GIF动画设置一个快乐的数字.现在你将每秒增加Constants.index一百次.
这正是你所看到的:15.625/10*30秒= 47秒.
您可以通过powercfg /energy
从提升的命令提示符运行来查看计算机上的活动速率.生成的报告显示"平台计时器分辨率"标题下的数字.
您必须避免依赖更新速率.