WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】

第一步:首先我们创建一个winfor的项目

WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】_第1张图片

第二步:我们建一个窗体
在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就开始下载 下载完成后 在注册窗体上面 显示下载完成(达到在一个窗体里面修改另外的一个窗体)

WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】_第2张图片

?
private void button1_Click( object sender, EventArgs e)
{
     FormLoad fl = new FormLoad();
     fl.Show();
}

 第三步:完成下载窗体的进度条

复制代码
        
private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i <= 100; i++)
            {
                this.progressBar1.Value = i;
                System.Threading.Thread.Sleep(300);
            }
        }
复制代码

第四步:处理窗体假死问题
(用到多线程和委托)

复制代码
public partial class FormLoad : Form
    {
        public FormLoad()
        {
            InitializeComponent();
            //为这个委托变量赋值
            changeProgerss = FunChangeProgress;
        }

        public void FunChangeProgress(int value)
        {
            this.progressBar1.Value = value;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //创建一个线程
            System.Threading.Thread thr = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Download));
            thr.Start(100);
        }

        //线程方法 一定要是obje 类型参数 同时返回值是void
        private  void Download(object obj)
        {
            for (int i = 0; i <= 100; i++)
            {
                //执行委托
                changeProgerss(i);
                System.Threading.Thread.Sleep(300);
            }
        }

        //在下载窗体上面 建一个委托
        public delegate void ChangeProgress(int value);
        //创建上面的委托的变量
        public ChangeProgress changeProgerss;

    }
复制代码

第五步:处理跨线程调用ui
线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。

复制代码
 
      for (int i = 0; i <= 100; i++)
            {
                //执行委托
                this.progressBar1.Invoke(changeProgerss, i);
                //changeProgerss(i);
                System.Threading.Thread.Sleep(300);
            }
复制代码

WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】_第3张图片

 

第六步 主窗体添加委托 解决跨线程调用UI

复制代码
        public FormMain()
        {
            InitializeComponent();
            sif = ShowInfoFun;
        }

        public void ShowInfoFun(string text)
        {
            this.label1.Text = text;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            FormLoad fl = new FormLoad();
            //在主窗体中注册子窗体的事件
            fl.eventShowInfo += new FormLoad.ShowInfo(fl_eventShowInfo);
            fl.Show();
        }

        //事件的执行方法
        void fl_eventShowInfo(string text)
        {
            this.label1.Invoke(sif, text);
        }

        //在主窗体这里 创建一个委托
        public delegate void ShowInfo(string text);
        public ShowInfo sif;
    }
复制代码

视频下载地址:http://pan.baidu.com/share/link?shareid=1740683788&uk=540184145

需要源码的可以到这里向楼主要:http://www.bamn.cn/redirect.php?tid=19&goto=lastpost#lastpost

你可能感兴趣的:(WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】)