在VS2005(dotnet2.0)中测试通过
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace test
{
public partial class Form1 : Form
{
//声明一个委托,这个委托将会在两个地方用到
public delegate void TimerStartHandle(string t);
//用新定义的委托定义一个本Form的事件OnTimerStart,其实在这里不要理解为事件,理解为委托的一个实例更合适。
public event TimerStartHandle OnTimerStart;
public Form1()
{
InitializeComponent();
}
{
public partial class Form1 : Form
{
//声明一个委托,这个委托将会在两个地方用到
public delegate void TimerStartHandle(string t);
//用新定义的委托定义一个本Form的事件OnTimerStart,其实在这里不要理解为事件,理解为委托的一个实例更合适。
public event TimerStartHandle OnTimerStart;
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 改变标签的文本,
/// </summary>
/// <param name="t"></param>
private void setLableText(String t)
{
this.label1.Text = t;
}
/// <summary>
/// 在主线程的基础上,执行一个委托,这一步在dotnet2.0中必不可少
/// 因为不能在别的线程中来修改主线程创建的控件的属性
/// </summary>
/// <param name="t"></param>
private void setLableTextThread(String t)
{
this.BeginInvoke(new TimerStartHandle(this.setLableText), new object[] { t });
}
/// <summary>
/// 线程池要执行的委托参数
/// </summary>
/// <param name="info"></param>
private void StartTimer(object info)
{
do
{
//执行事件委托,所以在线程中每执行一次StartTimer,就会触发一次OnTimerStart事件。
//从而会执行this.setLableTextThread中的语句
//而在this.setLableTextThread中,又会执行一个委托,即:setLableText
//这样就避开了在非主线程中修改由主线程创建的控件的问题
this.OnTimerStart(System.DateTime.Now.ToString("hh:mm:ss"));
Thread.Sleep(1000);
}
while (true);
}
/// 改变标签的文本,
/// </summary>
/// <param name="t"></param>
private void setLableText(String t)
{
this.label1.Text = t;
}
/// <summary>
/// 在主线程的基础上,执行一个委托,这一步在dotnet2.0中必不可少
/// 因为不能在别的线程中来修改主线程创建的控件的属性
/// </summary>
/// <param name="t"></param>
private void setLableTextThread(String t)
{
this.BeginInvoke(new TimerStartHandle(this.setLableText), new object[] { t });
}
/// <summary>
/// 线程池要执行的委托参数
/// </summary>
/// <param name="info"></param>
private void StartTimer(object info)
{
do
{
//执行事件委托,所以在线程中每执行一次StartTimer,就会触发一次OnTimerStart事件。
//从而会执行this.setLableTextThread中的语句
//而在this.setLableTextThread中,又会执行一个委托,即:setLableText
//这样就避开了在非主线程中修改由主线程创建的控件的问题
this.OnTimerStart(System.DateTime.Now.ToString("hh:mm:ss"));
Thread.Sleep(1000);
}
while (true);
}
private void Form1_Load(object sender, EventArgs e)
{
//指定响应的事件
this.OnTimerStart += new TimerStartHandle(this.setLableTextThread);
{
//指定响应的事件
this.OnTimerStart += new TimerStartHandle(this.setLableTextThread);
//由线程池来执行this.StartTimer。这时会依次执行this.setLableTextThread,setLableText
ThreadPool.QueueUserWorkItem(new WaitCallback(this.StartTimer));
//或创建一个线程
//Thread thr = new Thread(this.StartTimer);
//thr.Start();
}
}
}
ThreadPool.QueueUserWorkItem(new WaitCallback(this.StartTimer));
//或创建一个线程
//Thread thr = new Thread(this.StartTimer);
//thr.Start();
}
}
}
上面的代码在VS2003中编译后可以运行,其实在vs2003(dotnet1.1)还有一个简单得多:
...
private void Form1_Load(object sender, EventArgs e)
{
//指定响应的事件
this.OnTimerStart += new TimerStartHandle(this.setLableTextThread);
{
//指定响应的事件
this.OnTimerStart += new TimerStartHandle(this.setLableTextThread);
//由线程池来执行this.StartTimer。这时会依次执行this.setLableTextThread,setLableText
ThreadPool.QueueUserWorkItem(new WaitCallback(this.StartTimer));
//或创建一个线程
//Thread thr = new Thread(this.StartTimer);
//thr.Start();
}
ThreadPool.QueueUserWorkItem(new WaitCallback(this.StartTimer));
//或创建一个线程
//Thread thr = new Thread(this.StartTimer);
//thr.Start();
}
private void StartTimer(object info)
{
do
{
this.label1.Text = System.DateTime.Now.ToString("hh:mm:ss");
Thread.Sleep(1000);
}
while (true);
}
...
{
do
{
this.label1.Text = System.DateTime.Now.ToString("hh:mm:ss");
Thread.Sleep(1000);
}
while (true);
}
...