for (int i = 0; i < dataDijishi.Count; i++)
{
if (executeMarket(dataDijishi[i], hreshold))
{
MessageBox.Show(dataDijishi[i]);
}
}
如上,executeMarket是一个运行时间比较长的函数,涉及到向数据库中插入数据(这个不用管)。问题是这个for循环一下就执行完,导致后续出现一系列问题(错误)。当然我加上那个MessageBox,执行完一个循环我就点一下,这样虽然解决了问题,但就是太麻烦了,大神们,你们有什么好方法,教教我吧
------解决思路----------------------
如果后续的操作不依赖于这段for代码的话,那可以考虑多线程啊!!前台可以提示请稍候的信息
------解决思路----------------------
你要知道是什么错误,当然你中间做了一步阻塞当前线程的操作,阻塞时间应该是十几秒吧。
你手速慢的话。你可以把错误贴出来让大家看看啊
------解决思路----------------------
看你描述,明显executeMarket内部已经有异步在执行了……导致for一下子循环结束,但实际可能后面还要用到相关数据,导致会产生错误
学会Parallel.For吧,这个是专门用于并发操作的
------解决思路----------------------
如果executeMarket只是一个简单的方法,是不会出现你说的情况的。
因为你的if语句会等待你的executeMarket方法执行完数据库操作并返回值后再往下执行,for才会退出
建议你先设断点确认一下是不是for运行完了才报的错
如果是的话那把executeMarket的具体实现代码粘出来吧,感觉这里有多线程的操作,帮你分析下
------解决思路----------------------
实际操作都用异步了,当然就不会等你执行完再返回了。。。
------解决思路----------------------
不用异步不就得了?看你的需求,反正都是要等数据写完才能进行下一步的,何必画蛇添足用异步呢
------解决思路----------------------
实际操作都用异步了,当然就不会等你执行完再返回了。。。
对呀,怎么办?
看你代码,conn.Close();,其中conn貌似是全局的,那么可以设想下,其中一个线程把conn给Close了,那么你其他线程当然不能使用已被关闭的conn。所以这个问题你得注意下。
另外关于界面不卡,你完全可以换一个思路,把循环放到一个线程里面执行,循环开始前打开conn,循环结束后再关闭conn,由于过程仍然在线程中,界面一样不卡
------解决思路----------------------
你这个造成数据库更新锁了,同时发N个请求更新某个表数据
------解决思路----------------------
可以使用AutoResetEvent控制一下
------解决思路----------------------
AutoResetEvent reset = new AutoResetEvent(false);
for (int i = 0; i < Count; i++)
{
//执行异步方法
reset.WaitOne();
}
等异步方法执行完 reset.Set();
------解决思路----------------------
lock(obj){}
------解决思路----------------------
1. 整个for循环都应该放在一个线程里,而不是每次循环创建一个新线程。
2.不要频繁开关闭数据库连接。
------解决思路----------------------
那就不要循环调用executeMarket(dataDijishi[i], hreshold), 而应该直接把 整个数组传过去, 在异步方法里进行for循环..
------解决思路----------------------
用两个线程就可以了哦
------解决思路----------------------
如果后续的操作不依赖于这段for代码的话,那可以考虑多线程啊!!前台可以提示请稍候的信息