while()加条件,造成数据库需要重新open

源代码如下:

 while (true)
            {
                string connStr = ConfigurationManager.AppSettings["ConnectionString"];
                MySqlConnection mycon = new MySqlConnection(connStr);
                mycon.Open();
                
                string sql = "select * from *******";
                MySqlCommand cmd = new MySqlCommand(sql, mycon);
                MySqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())                     
                {
                    ******= opcGroup.OPCItems.AddItem(Convert.ToString(reader["******"]), 0);
                    ****** = opcGroup.OPCItems.AddItem(Convert.ToString(reader["*******"]), 0);
                    ******= opcGroup.OPCItems.AddItem(Convert.ToString(reader["*******"]), 0);
                    ******= opcGroup.OPCItems.AddItem(Convert.ToString(reader["********"]), 0);
                    ******= opcGroup.OPCItems.AddItem(Convert.ToString(reader["********"]), 0);
                    ******.Read((short)OPCDataSource.OPCDevice, out Value1, out DoorDescQty, out DoorDescTime);
                    ******.Read((short)OPCDataSource.OPCDevice, out Value2, out DoorOnOffQty, out DoorOnOffTime);
                    ******.Read((short)OPCDataSource.OPCDevice, out Value3, out DoorAlarmQty, out DoorAlarmTime);
                    ******.Read((short)OPCDataSource.OPCDevice, out Value4, out ReaderDescQty, out ReaderDescTime);
                    ******.Read((short)OPCDataSource.OPCDevice, out Value5, out ReaderCardQty, out ReaderCardTime);
                    string updsql = String.Format("******************************************");
                    //Console.WriteLine(updsql);
                    //这里需要重新打开一遍数据库
                    MySqlConnection conUpd = new MySqlConnection(connStr);
                    conUpd.Open();
                    MySqlCommand cmdUpd = new MySqlCommand(updsql, conUpd);
                    cmdUpd.ExecuteNonQuery();
                    conUpd.Close();
                }
                mycon.Close();

在以上代码中,可以看到,一开始就已经链接字符串并且select *了一个数据表中的所有数据,然后用Reader来read了那些数据,然后在下面的while()中,进行实际操作,读取并OPC数据,更新数据库的时候,需要重新打开一次数据库,不然的话会报错,这个问题一开始我觉得有些奇怪,因为我这个小的while完全写在外面数据库的open-close中间的,为什么还要再打开关闭一次数据库呢,这样不会造成额外的操作空间和资源浪费吗?

其实这里使用while(reader.Reader())的时候,做了条件判断,这其实也就是多线程最常用的方法,用while()判断语句来开启新的线程,在开启新的线程后,跟原来线程有了一定的区别,因此需要重新open和close一次数据库,才能在新的线程里对数据库表进行操作。

那么由此延伸出来的问题,while()包括if()这些条件判断语句,跟多线程有什么样的关系呢

实际上,在多线程操作中:

在多线程操作中,我们常常会遇到需要先判断信号量状态是否就绪,然后执行后续操作的场景。

判断的时候,就是使用while()和if()的时候,由此来决定是否满足开启新线程的条件。

多线程操作最经典的就是上学的时候那个“生产者消费者问题”,加上“数学家就餐问题”,以及“读者写者问题”,这三个都是面试笔试多发试题。如何判断队列是否满,不能产生死锁,何时阻塞,这些问题。可以多加关注,因为这一部分目前水平有限,也还没有彻底吃透,所以先不信口开河,凭印象流误人子弟,所以具体到日后可以进行详解。

有一篇介绍为什么生产者消费者模型中,使用while()判断而不是if()判断的文章:

https://www.cnblogs.com/limingluzhu/p/4325784.html

以上内容仅供参考,共同进步。欢迎指正。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值