主代码:
1 List<Thread> threadslList = new List<Thread>(); 2 int finishcount = 0; 3 object locker = new object(); 4 5 private void button1_Click(object sender, EventArgs e) 6 { 7 for (int i = 0; i < pageList.Length; i++) 8 { 9 //....... 10 for (int j = 0; j < 2; j++) 11 { 12 Thread t = new Thread(new ParameterizedThreadStart(Task)); 13 t.Name = i + "" + j; 14 t.IsBackground = true; 15 threadslList.Add(t); 16 t.Start(); 17 } 18 lock (locker) 19 { 20 while (finishcount != 2) 21 { 22 Monitor.Wait(locker);//等待 23 } 24 } 25 } 26 } 27 28 public void Task(object obj) 29 { 30 while(pages.Count > 0) 31 { 32 //.............. 33 //处理事件 34 } 35 lock (locker) 36 { 37 finishcount++; 38 Monitor.Pulse(locker); //完成,通知等待队列,告知已完,可以下一个。 39 } 40 41 }
这一段代码的意思是, 有个Page列表, 每次两个线程去处理, 处理完毕才能进入下个。
现在我这么写在执行时整个窗体就会卡住。
试过遍历threadslList中的线程去Join , 也会卡住。
补充: 界面上没有跨线程访问控件, 是.net3.5 没有task.waitall这个。
求解决办法。。
看你写的这代码,我只能劝你用 BackgroundWorker 组件,把你 button1_Click( 中的代码都扔到 DoWork 中去。
大侠见笑了~~~~小弟弟我刚入行半年。这代码请包含……………………我换了种方式, 在线程调用的方法里用回调函数标识完毕, 不用monitor就解决了。 网上搜了半天的monitor, 傻拉8鸡的我没想好就开写了, 最后还是没有彻底搞清楚monitor,囧。。。
另外, 丢到BackgroundWorker的DoWork 中确实能解决卡的问题。 试过了, 不过不知道RunWorkerCompleted为何还没结束就触发了。。。e.Cancelled 又不是true……
算了先下班, 晚上回家再试试这个, 这东西虽然头大,但是做起来好玩。。。
是啊,楼上大神说得好。
象我这样的菜鸟一般能用Backgroundworker绝对不用Thread。
大叔, 说什么好呢……
如果你是菜鸟的话, 就可以拍一部电影《天下无鸟》了!
首先你的finishcount只增不减,所以超过2后就永远的等待了,其次,为什么不试试信号量呢?
不好意思, 代码没给全, finishcount在第9行已经被=0了的。
semaphore类相当给力啊, 我试试。