首页 新闻 会员 周边

c#多线程,用Monitor等待线程结束会卡住总个窗体,求解决方案

0
悬赏园豆:30 [已解决问题] 解决于 2015-02-12 13:08

  主代码:

 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这个。 

求解决办法。。

奋奋奋的主页 奋奋奋 | 初学一级 | 园豆:32
提问于:2015-02-09 16:48
< >
分享
最佳答案
0

看你写的这代码,我只能劝你用 BackgroundWorker 组件,把你 button1_Click( 中的代码都扔到 DoWork 中去。

收获园豆:20
Launcher | 高人七级 |园豆:45045 | 2015-02-09 16:51

大侠见笑了~~~~小弟弟我刚入行半年。这代码请包含……………………我换了种方式, 在线程调用的方法里用回调函数标识完毕, 不用monitor就解决了。 网上搜了半天的monitor, 傻拉8鸡的我没想好就开写了, 最后还是没有彻底搞清楚monitor,囧。。。

另外, 丢到BackgroundWorker的DoWork 中确实能解决卡的问题。 试过了, 不过不知道RunWorkerCompleted为何还没结束就触发了。。。e.Cancelled 又不是true……

算了先下班, 晚上回家再试试这个, 这东西虽然头大,但是做起来好玩。。。

奋奋奋 | 园豆:32 (初学一级) | 2015-02-09 18:19
其他回答(2)
0

是啊,楼上大神说得好。

象我这样的菜鸟一般能用Backgroundworker绝对不用Thread。

收获园豆:1
爱编程的大叔 | 园豆:30839 (高人七级) | 2015-02-09 16:57

大叔, 说什么好呢……

如果你是菜鸟的话, 就可以拍一部电影《天下无鸟》了!

支持(0) 反对(0) 奋奋奋 | 园豆:32 (初学一级) | 2015-02-09 18:21
0

首先你的finishcount只增不减,所以超过2后就永远的等待了,其次,为什么不试试信号量呢?

收获园豆:9
xujiatao | 园豆:360 (菜鸟二级) | 2015-02-09 19:29

不好意思, 代码没给全, finishcount在第9行已经被=0了的。 

semaphore类相当给力啊,  我试试。 

支持(0) 反对(0) 奋奋奋 | 园豆:32 (初学一级) | 2015-02-10 10:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册