回调(委托)与线程

1.线程间的工作是相互独立的;

2.CheckForIllegalThreadCalls=False; 不检查线程间的错误/冲突,在实际开发中禁止使用,这会导致线程不安全;

3.流程:

  为了使窗体应用程序运行更加流程,最好使用非阻塞(异步)的方式;

  如下例:

  需要使主窗体运行progressBar2的同时,运行progressBar1,且鼠标拖动时不影响progressBar1的运行;

  那么,先定义一个委托(回调),并对其声明,实例化,接着创建一个线程,开启线程,并在该线程中调用委托完成被委托方法的功能。

 

  效果图:

运行程序后

点击start按钮后

鼠标拖动后

  代码如下:

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace 线程
{
    public partial class frmXC : Form
    {
        delegate void SetProgressbarValueDelegate(int value);     //定义回调(委托)
        SetProgressbarValueDelegate setProgressbarValue;          //声明回调(委托)

        public frmXC()
        {
            InitializeComponent();
        }

        private void btn_Start_Click(object sender, EventArgs e)
        {
            setProgressbarValue = new SetProgressbarValueDelegate(setpgb1Value);//实例化委托
            Thread pgb1Thread = new Thread(progressBar1);       //创建一个新的线程
            pgb1Thread.Start();                                 //线程开始
            for(int i=0;i<100;i++)                              //主线程有进度条1
            {
                Application.DoEvents();                         //交出控制权,以便响应事件,消除假死现象
                Thread.Sleep(50);                               //延时50ms
                pgb_bar2.Value=i;                               //设置进度条2的值
            }

        }
        private void progressBar1()                             //设置进度条1的值的线程
        {
            for (int i = 0; i < 100;i++ )                       //循环设置
            {
                Thread.Sleep(50);   //50ms
                pgb_bar1.Invoke(setProgressbarValue, i);        //通过回调(委托)设置进度条1的值
            }
        }


        private void setpgb1Value(int value)                    //设置进度条2值被委托的方法
        {
            pgb_bar1.Value=value;
        }

    }
}

posted @ 2013-04-20 11:29  在路上的人  阅读(562)  评论(0)    收藏  举报