我知道这可能看起来是个愚蠢的问题,但这是我的问题。我有一个worker对话框,它“隐藏”了一个后台worker,所以我在worker线程中做我的工作,我以标准的方式报告进度,然后在我的WPF程序中显示结果。该对话框包含一个简单的动画gif和一个标准的wpf进度条,当收到进度通知时,我会设置Value属性。所有的锁都像往常一样,适用于任何类型的工作,如web服务调用、数据库查询、后台精化等。对于我的工作,我们还使用了许多“耦合器”,即从智能卡读取数据的读卡器,使用访问串行端口的本机C代码进行管理(所以,我不使用.NET SerialPort object)。我有一些nunit测试,我在10秒内读取了一个样本卡,但使用我的实际程序,在后台worker下显示我的worker对话框,我需要1.30分钟来做同样的工作。我在问题中挣扎了几天,直到我决定删除worker对话框,而没有对话框,我获得了测试的相同性能!所以我调查了一下,它不是对话框,也不是动画gif,而是wpf进度条!简单地说,显示进度条(因此,没有动画,没有设置值,什么都没有)会降低串口通信的速度。看起来不可思议吗?我已经测试过这个行为,它确实发生了。
发布于 2010-05-23 18:58:48
你所描述的听起来完全正常。更新一次进度条的值是一项相对微不足道的任务,但如果您的代码正在执行大量操作,那么每次更新进度条所花费的总时间可能会比操作本身花费的总时间多得多。
如果您的代码执行10,000次操作,请尝试将进度条的最大值设置为10,并且每1000次操作才更新一次进度条。
另一种可能是使用BeginInvoke而不是Invoke来设置条形图的值(如果您一开始就是这样做的)。Invoke会一直阻塞,直到被调用的方法完成,这意味着循环中的每个操作都必须等待进度条更新,然后才能继续。
发布于 2010-05-24 04:56:31
我总是使用下面的代码来更新进度条(必须在UI线程中运行)
private int UpdateCount = 0;
public void UpdateProgress(int value)
{
// We are updating every tenth time.
if (((UpdateCount % 10) == 0)) {
ProgressBar1.Value = value;
}
UpdateCount += 1;
}https://stackoverflow.com/questions/2891365
复制相似问题