WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】

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

 2013/8/8 18:08:44  麦武彬  博客园  我要评论(0)
  • 摘要:第一步:首先我们创建一个winfor的项目第二步:我们建一个窗体在一个窗体里面打开一个另外的窗体另外的窗体有一个按钮点击后就开始下载下载完成后在注册窗体上面显示下载完成(达到在一个窗体里面修改另外的一个窗体)privatevoidbutton1_Click(objectsender,EventArgse){FormLoadfl=newFormLoad();fl.Show();}第三步:完成下载窗体的进度条privatevoidbutton1_Click(objectsender
  • 标签:事件 for 进度条 多线程 下载 一个 应用 winform 线程

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

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

class="brush:csharp;gutter:false;">        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

发表评论
用户名: 匿名