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,就不动了。估计是出现了竞技状态。
请高手指点一二。
{
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,就不动了。估计是出现了竞技状态。
请高手指点一二。
解决方案 »
- 求助:关于c#程序怎么连接上SQL空间?
- C#中打印时选择打印机的问题。
- interop程序集和pia的区别
- 现在时网盾的学员受欢迎还是双N的或者是北大青鸟?(穷。。。散分)
- C#中BindingList的用法,自己的笔记贴
- 如何DataGridView中的CheckBox列中的某些单元格根据数据绑定不显示出来?
- 华为cmpp3.0中初始化函数参数在C#中如何转换?
- 2个不同窗体的2个dataGridView控制相同数据源问题
- 关于操作Word的问题
- 用VS2015写razor页面遇到添加where查询条件不报错但查不出结果
- 为什么组件突然不能在VS2008里显示按钮图片了呢?求高手指点!
- 如何模拟jsp网站上的参数传递,在线求教!内附详细情况
Control.CheckForIllegalCrossThreadCalls = false;//这是一种非常不正规且愚蠢的做法
使用匿名委托吧
如果你们还没有看明白,我再解释一下,去掉红字部分,就是访问网络的部分,没有任何问题。
不关委托的事,使用非线程安全时候为了不出现竞技状态。
没有WebResponse wrs = wrq.GetResponse(); 也没有出现问题。我觉得问题出现在等待网络返回的时候。红字移动到try里面也不行。只要有WebResponse wrs = wrq.GetResponse();就不行。
{
//你的代码
}
当线程走到这个位置的时候,如果没有锁,即会加上锁然后继续,其他的线程走到这个位置的时候会等待解琐后再继续~
即使这样还不够,还需要配合委托,而且记的要用INVOKE同步委托