public void count(object item)
 {
            Control.CheckForIllegalCrossThreadCalls = false; //禁用跨线程调用错误
                       for (int i = 0; i < 10000; i++)
          {
               
                    WebRequest wrq = WebRequest.Create("http://www.sina.com.cn");
                    wrq.Timeout = 1000000;
                    WebResponse wrs = wrq.GetResponse();
                                                  Monitor.TryEnter(this.listView1, 5000);
                 try
                  {
                    ((ListViewItem)item).SubItems[0].Text
                        = (Convert.ToInt32(((ListViewItem)item).SubItems[0].Text) + 1).ToString();
                   }                finally
                {
                    Monitor.Exit(this.listView1);
                }
            }
        }最开始做的时候是一个数数的方法,多个线程对listview里面的每一行同时进行递增操作,程序很正常,没有红字部分。后来加入了访问网页的语句,程序就执行不下去了。每次都是第一行数到2,就不动了。估计是出现了竞技状态。
请高手指点一二。

解决方案 »

  1.   

    在非UI线程中是禁止访问UI控件的,请使用委托
      

  2.   

    把红字部分下移到try里面试试
      

  3.   

    这样不死才怪
    Control.CheckForIllegalCrossThreadCalls = false;//这是一种非常不正规且愚蠢的做法
    使用匿名委托吧
      

  4.   

    使用委托试过,会出现竞技状态。或者谁能指点下如何不出现竞技状态的委托方法。
    如果你们还没有看明白,我再解释一下,去掉红字部分,就是访问网络的部分,没有任何问题。
    不关委托的事,使用非线程安全时候为了不出现竞技状态。
    没有WebResponse wrs = wrq.GetResponse();  也没有出现问题。我觉得问题出现在等待网络返回的时候。红字移动到try里面也不行。只要有WebResponse wrs = wrq.GetResponse();就不行。
      

  5.   

    lock (this)
                {
                    //你的代码
                }
    当线程走到这个位置的时候,如果没有锁,即会加上锁然后继续,其他的线程走到这个位置的时候会等待解琐后再继续~
    即使这样还不够,还需要配合委托,而且记的要用INVOKE同步委托