当前位置: 代码迷 >> C# >> C# 怎么分开执行函数?使用if语句也不可以,小弟我错哪了吗
  详细解决方案

C# 怎么分开执行函数?使用if语句也不可以,小弟我错哪了吗

热度:29   发布时间:2016-05-05 04:21:55.0
C# 如何分开执行函数?使用if语句也不可以,我哪里错了吗?
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的具体实现代码粘出来吧,感觉这里有多线程的操作,帮你分析下

------解决思路----------------------
引用:
无法更新;当前被锁定

这个就是错误,发生错误的地方是:
          
  string sqlstr = string.Format("UPDATE FromHandled SET LON= '{0}' ,LAT= '{1}' ,ObjectID={2}, 来源='{3}',GDB名称='{4}' ,GDB地址='{5}', 精确度={6} WHERE 企业名称= '{7}'", data.LON, data.LAT, data.OBJECTID, data.SOURCE, data.NAME, data.ADDRESS, data.jingquedu, data.qiyemingcheng);
            OleDbCommand cmd = new OleDbCommand(sqlstr, conn);
           cmd.ExecuteNonQuery();
            conn.Close();

就是这句cmd.ExecuteNonQuery();

我确实使用了Thread,我当时的目的只有一个:让界面不卡!
这种情况还有救么?


实际操作都用异步了,当然就不会等你执行完再返回了。。。
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

无法更新;当前被锁定

这个就是错误,发生错误的地方是:
          
  string sqlstr = string.Format("UPDATE FromHandled SET LON= '{0}' ,LAT= '{1}' ,ObjectID={2}, 来源='{3}',GDB名称='{4}' ,GDB地址='{5}', 精确度={6} WHERE 企业名称= '{7}'", data.LON, data.LAT, data.OBJECTID, data.SOURCE, data.NAME, data.ADDRESS, data.jingquedu, data.qiyemingcheng);
            OleDbCommand cmd = new OleDbCommand(sqlstr, conn);
           cmd.ExecuteNonQuery();
            conn.Close();

就是这句cmd.ExecuteNonQuery();

我确实使用了Thread,我当时的目的只有一个:让界面不卡!
这种情况还有救么?


实际操作都用异步了,当然就不会等你执行完再返回了。。。

对呀,怎么办?

不用异步不就得了?看你的需求,反正都是要等数据写完才能进行下一步的,何必画蛇添足用异步呢
------解决思路----------------------
引用:
实际操作都用异步了,当然就不会等你执行完再返回了。。。

对呀,怎么办?
看你代码,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代码的话,那可以考虑多线程啊!!前台可以提示请稍候的信息
嗯嗯
  相关解决方案