dotnet 2.0与1.1中线程的小差异

本文介绍在Visual Studio 2005环境下使用.NET 2.0进行多线程编程的方法,演示了如何通过委托和事件在后台线程安全地更新UI组件,避免跨线程操作引发的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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;
namespace test
{
    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);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //指定响应的事件
            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();
        }
    }
}
 
上面的代码在VS2003中编译后可以运行,其实在vs2003(dotnet1.1)还有一个简单得多:
...
 
        private void Form1_Load(object sender, EventArgs e)
        {
            //指定响应的事件
            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();
        }
 
        private void StartTimer(object info)
        {
            do
            {
                this.label1.Text = System.DateTime.Now.ToString("hh:mm:ss");
                Thread.Sleep(1000);
            }
            while (true);
        }
...
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值