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


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

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

            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);
                }

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

  • 相关阅读:
    error: conflicting type qualifiers for &#39;xxxxx&#39;
    每天进步一点点——负载均衡之DNS域名解析
    hdu 1348 Wall(凸包模板题)
    offsetTop和scrollTop的差别
    OnContextMenu事件
    写给即将面临毕业的程序猿们
    hibernate uniqueResult方法
    UpdatePanel的用法
    Spring MVC 3 深入总结
    优麒麟(UbuntuKylin)不是国产Linux操作系统
  • 原文地址:https://www.cnblogs.com/maijin/p/3246238.html
Copyright © 2020-2023  润新知