做一个简单的弹框提醒,这里需要用到线程,那什么是线程,我百度了一下,大概是这个意思:
通过System.Threading.Thread类可以开始新的线程,并在线程堆栈中运行静态或实例方法。可以通过Thread类的的构造方法传递一个无参数,并且不返回值(返回void)的委托(ThreadStart),这个委托的定义如下:
[ComVisibleAttribute(true)]
public delegate void ThreadStart()
我自己也不是特别懂,想了解的话建议直接百度。
今天做的这个实例是:在数据库中有一张表,这张表只有四个字段,分别是id,name,state,time。代表着id,姓名,状态和时间。我需要做的就是当我打开这个窗体的时候,这张表的信息会显示出来,在这里会用时间作对比,用系统的时间减去表中的时间,超过五分钟就弹框说“谁谁谁超时了”,每隔十秒弹一次。感觉很简单的样子。下面进入写代码的时间,首先需要连接数据库,这个应该就不用详细说了吧。
先定义一个全局变量,这个变量就是用来存储连接数据库语句的:
string str = @"server=localhost;database=数据库名称;user id=sa;pwd=密码";
在load里面就要写一个线程了,为什么需要写线程呢?我的原因是因为如果不写在线程里面,弹框就会在页面出现之前弹出来,显然是不符合道理的。并且我需要做自动刷新,在不关闭页面的情况下,在数据库中插入数据能够自动刷新上去。
private void Form1_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false;//获取或设置一个值,该值指示是否捕获对错误线程的调用,这些调用在调试应用程序时访问控件的 Handle 属性 Thread th = new Thread(new ThreadStart(() => { while (true) { try { SqlConnection con = new SqlConnection(str); con.Open();//打开数据库连接 string sql = "SELECT * FROM T_USER";//查询语句 SqlDataAdapter data = new SqlDataAdapter(sql, con); DataSet1 ds = new DataSet1(); data.Fill(ds); con.Close(); DataTable dt = ds.Tables[0];//把查询出来的数据放在内存中的数据表中 dataGridView1.DataSource = dt;//绑定数据 string s = ""; string name = ""; DateTime dtime; TimeSpan ts; for (int i = 0; i < dt.Rows.Count; i++) { s = dt.Rows[i][3].ToString();//循环找出每一行的时间 name = dt.Rows[i][0].ToString();//循环找出每一行对应的名字 dtime = Convert.ToDateTime(s);//获取到查出来的时间 ts = System.DateTime.Now - dtime;//用系统的时间减去表中的时间 if (ts.Minutes >= 5)//如果大于五分钟 { MessageBox.Show(name + "超时了");//弹框“谁谁谁超时了” } } } catch (Exception ex) { MessageBox.Show(ex.ToString());//异常 } finally { Thread.Sleep(10000);//每隔十秒自动刷新重新弹框 } } } ) ); //创建线程 th.IsBackground = true; th.Start(); //启动线程 } }
Control.CheckForIllegalCrossThreadCalls = false;//这句话很关键,如果没有这句话,绑定数据源的时候就会出现异常。 Thread th = new Thread(new ThreadStart(() =>{}));//创建线程
好了,今天的内容就分享到这里了。
原文地址:https://www.cnblogs.com/madan01/p/10556698.html
时间: 2024-10-10 12:59:38