我使用的是.Net 4.0和VS2010。
我的程序只是一个多线程的get请求发送器,它通过DataGridView更新bindingList并显示列表。datagridview处于虚拟模式。此外,我制作了一个文本框和状态栏来显示请求的状态,一个请求通常会在文本框中添加4-5行,并更改状态栏中的数字。
工作负载保持不变,每两秒一个请求。请求速度很快,大多数时候只有一个请求很突出。新的请求线程由最后一个旧的请求线程调用。UI在每个线程中使用begininvoke和delegate更新几次。
MyInvoke mi = new MyInvoke(change);
this.BeginInvoke(mi, new Object[] { true, "Row " + pos + " standing by...", (pos + 1),0 });开始时,我在datagridview上显示了整个3000个请求,内存使用量为30MB。当达到内存使用量为4XMB的2XXX请求时,我可以看到状态栏编号和文本框的更新越来越慢。例如,2000->2001->2002->2003变成了2000->2003。
如果我选择应用程序窗口,有时整个UI甚至会冻结。我的datagridview使用虚拟模式固定在几行上。我认为这是UI线程的问题。当它冻结时,我可以等待,直到所有请求都完成,一切又变得顺利。
对正在发生的事情有什么想法吗?
发布于 2012-10-31 15:47:47
最后,我找到了为什么它这么慢的原因。像我这样的菜鸟很容易犯这样的错误。我在线程期间使用的大量begininvoke确实会产生影响,但不足以冻结UI线程。
繁重的工作负载主要由下面的代码购买,这些代码每次都会将整个文本分配给文本框
textbox1.Text += "string"下面的代码可以解决这个问题
textbox1.AppendText("string")https://stackoverflow.com/questions/13115181
复制相似问题