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

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

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

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

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

        private void button1_Click(object sender, EventArgs e)

        {

            FormLoad fl = new FormLoad();

            fl.Show();

        }

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

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

        

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中 事件 委托 多线程的应用【以一个下载进度条为例】

 

第六步 主窗体添加委托 解决跨线程调用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)