第一次发文章,水平有限,如有错误欢迎大家指出。
声明:
1,测试环境为vs2008, .net framework 3.5
2,此次我使用的Timer是 System.Windows.Forms 命名空间下的 Timer 组件,另外两个Timer我没试验。
3,我没有用工具箱添加Timer和BackgroundWorker
首先
介绍一下画面
总共有3个Form

点击第一个图标弹出下面的画面

点击第二个图标弹出下面的画面

两个画面很类似。
实现的是同一个功能。
主画面功能不详述。
先说第一个画面
- using System;
- using System.Windows.Forms;
- namespace TimerAndWorker
- {
-
-
- /// 运行时会出现画面假死
- /// </summary>
- public partial class FrmTimer : Form
- {
- public FrmTimer()
- {
- InitializeComponent();
- }
- #region "变量定义"
- private System.Windows.Forms.Timer timer;
- Random rd;
- #endregion
- #region "Timer相关的内容"
-
-
- private void InitTimer()
- Console.WriteLine("进入 InitTimer");
- this.timer = new System.Windows.Forms.Timer();
- this.timer.Interval = 5000;
- this.timer.Tick += new System.EventHandler(this.timer1_Tick);
- this.timer.Start();
- Console.WriteLine("走出 InitTimer");
- }
- /// Timer每隔一定时间将会让画面执行一次这个方法
- /// <param name="sender"></param>
- /// <param name="e"></param>
- void timer1_Tick(object sender, EventArgs e)
- Console.WriteLine("进入 timer1_Tick");
- this.UseWaitCursor = true;
-
-
- Console.WriteLine("开始忙碌");
- // 画面将会出现假死现象
- System.Threading.Thread.Sleep(3000);
- Console.WriteLine("停止忙碌");
- foreach (DataGridViewRow row in dataGridView1.Rows)
- {
- if (rd.Next(1, 100) % 2 == 0)
- {
- row.Cells["columnStatus"].Value = "连接";
- }
- else
- row.Cells["columnStatus"].Value = "断开";
- }
- false;
- Console.WriteLine("走出 timer1_Tick");
- #endregion
- #region "与Form有关的内容"
- // 定义了一个产生随机数的对象
- // 目的是为了随机生成画面上的状态
-
- /// Form的Load事件
- void FrmTimer_Load( Console.WriteLine("进入 FrmTimer_Load");
- InitDataGridView();
- InitTimer();
- // 给随机数一个种子
- rd = new Random(DateTime.Now.Millisecond);
- Console.WriteLine("走出 FrmTimer_Load");
- /// 给画面上的DataGridView赋初值
- void InitDataGridView()
- Console.WriteLine("进入 InitDataGridView");
- for (Int32 i = 1; i < 6; i++)
- {
- dataGridView1.Rows.Add(new String[] { "192.168.1." + i.ToString(), "断开" });
- Console.WriteLine("走出 InitDataGridView");
- /// 关闭画面
- void btnClose_Click( Console.WriteLine("进入 btnClose_Click");
- this.Close();
- Console.WriteLine("走出 btnClose_Click");
- /// 画面关闭时
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- void FrmTimer_FormClosing( {
- Console.WriteLine("进入 FrmTimer_FormClosing");
- timer.Stop();
- Console.WriteLine("走出 FrmTimer_FormClosing");
-
- }
- }
利用Timer的实现机制实际上是事件(event)机制
this.timer.Tick += new System.EventHandler(this.timer1_Tick);
这一行代码是让Timer在指定时间触发一个事件
而画面定义一个方法
private void timer1_Tick(object sender,EventArgs e)
对此事件进行响应。
此响应方法是Form的线程去执行的方法,所以,在此方法内执行很耗时的操作时。画面将会出现假死现象。
例如:读数据库或者进行网络连接以及复杂运算等等。
本例采用
System.Threading.Thread.Sleep(3000);
来代替耗时操作。实际运行时出现画面没响应的现象,具体现象请下载代码实践一下。
以下是执行时输出的日志