源代码如下:
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
以上内容仅供参考,共同进步。欢迎指正。