当前位置: 代码迷 >> C# >> 多线刷新主界面解决方法
  详细解决方案

多线刷新主界面解决方法

热度:161   发布时间:2016-04-28 08:39:49.0
多线刷新主界面
我需要开100多个线程,每个线程Get Post  某个账号的数据到某个网站,模拟登录采集信息,因为完成1个账号需要很长的步骤,很长的时间,所以在这种情况下线程数越多往往效率越高,我的问题:
1:我测试代码的时候发现,往往点了开始后立刻出现大约20个线程的进度提示,其他线程是在之后,大概每过1秒才显示出来,这样100个线程全部开始运行往往要等好久,这是为什么呢,都是这样的么?
2:我用的Listview控件来显示每一个线程目前进展到哪一步了,用委托来刷新主界面的Listview内容,但是感觉显示Listview本身就很费时间,因为我测试了显示2000行居然需要2秒(vb6显示2000行才1秒不到,不知道为什么),有什么更效率的方法可以让我看到每个线程进展到哪步的提示么?
------解决思路----------------------
1 那个现象是因为你用了线程池吧,线程池有最小线程数量,如果不设置就是默认CPU核心数量的线程能立即启动(如果当时有空闲出来的工作线程当然也能立即工作),接下来的工作线程创建就要等待。这个可以通过 ThreadPool.SetMinThreads(100, 100); 设置最小线程数量。或者自己创建 Thread,就不受线程池的影响。

2  UI 本来就是很慢的,工作线程多了以后频繁的进度报告会成为瓶颈,甚至可能让 UI 卡住。如果想提高效率,那么应该解耦任务和UI,任务的进度写入一个队列,UI 上通过定时器比如 500ms 一次从这个队列里取所有数据,在 SuspendLayout / ResumeLayout 内对控件添加数据。

我估计说什么开线程是笨办法,I/O 密集和计算密集应该采取不同的方法可能并不能让你更快的解决目前的问题。不过你需要了解这种需求大量时间用于 I/O,使用异步 I/O 才能最大限度的不浪费资源。在客户端开发中,如果这种浪费能接受,倒也无所谓,而在服务端开发中,这种浪费往往不可接受,就必须使用异步 I/O。
  相关解决方案