关于C#中的多线程编程(以实际项目为导向)

1.禁止编译器对跨线程调用进行检查

        1)在代码中加入:

        Control.CheckForIllegalCrossThreadCalls = false;

2.使用委托(delegate)和invoke从非UI线程中调用控件

        1)同步调用

        private void button2_Click(object sender, EventArgs e)
        {
            Thread thread1 = new Thread(new ParameterizedThreadStart(UpdateLabel2));
            thread1.Start("更新Label");
        }

        private void UpdateLabel2(object str)
        {
            if (label2.InvokeRequired)
            {
                // 当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问
                //Lambd表达式,匿名函数。
                Action<string> actionDelegate = (x) => { this.label2.Text =                 x.ToString(); };
                // 或者
                // Action<string> actionDelegate = delegate(string txt)                 {this.label2.Text = txt; };
                this.label2.Invoke(actionDelegate, str);
            }
            else
            {
                this.label2.Text = str.ToString();
            }
        }

        注:其中Aciton由CLR提供,是委托的一种。

3.使用委托(delegate)和BeginInvoke,从其他线程调用UI控件

        1)将2中Invoke()改为BeginInvoke()即可

        注:区别为Invoke()是同步调用,BeginInvoke()是异步调用。

4.使用BackgroundWorker组件

        1)其为.Net中执行多线程任务的控件。

               private void button4_Click(object sender, EventArgs e)

        {
            using (BackgroundWorker bw = new BackgroundWorker())
            {
                bw.RunWorkerCompleted += new                 RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.RunWorkerAsync("Tank");
            }         
        }

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {       
            // 这里是后台线程, 是在另一个线程上完成的
            // 这里是真正做事的工作线程
            // 可以在这里做一些费时的,复杂的操作
            Thread.Sleep(5000);
            e.Result = e.Argument + "工作线程完成";
        }

        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //这时后台线程已经完成,并返回了主线程,所以可以直接使用UI控件了 
            this.label4.Text = e.Result.ToString(); 
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值