0

我正在使用 .Net 4.0 和 VS2010。

我的程序只是一个多线程获取请求发送者,它更新一个 bindingList 并通过 DataGridView 显示列表。datagridview 处于虚拟模式。此外,我制作了一个文本框和状态栏来显示请求的状态,一个请求通常会在文本框中添加 4-5 行并更改状态栏中的数字。

工作负载保持不变,每两秒一个请求。请求速度很快,大部分时间只有一个请求突出。新请求线程由最后一个旧请求线程调用。UI 使用 begininvoke 和委托在每个线程中更新几次。

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线程的问题。当它冻结时,我可以等到所有请求都完成并且一切再次变得顺利。

对正在发生的事情有任何想法吗?

4

1 回答 1

0

最后,我弄清楚了为什么它这么慢。像我这样的菜鸟可能很容易犯这种错误。我在线程期间使用的大量 begininvoke 确实有影响,但不足以冻结 UI 线程。

繁重的工作量主要是由以下代码购买的,它每次都将整个文本分配给文本框

 textbox1.Text += "string"

下面的代码可以解决它

textbox1.AppendText("string")
于 2012-10-31T07:47:46.807 回答