WinForm 多線程更新UI控件 進度條(C#,NET,WinForm)

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            ThreadMethod method = new ThreadMethod();
            //先訂閱一下事件
            method.threadStartEvent += new EventHandler(method_threadStartEvent);
            method.threadEvent += new EventHandler(method_threadEvent);
            method.threadEndEvent += new EventHandler(method_threadEndEvent);
            Task task = new Task(() => { method.runMethod(); });
            task.Start();
        }
        /// <summary>
        /// 線程開始事件,設置進度條最大值
        /// 但是我不能直接操作進度條,需要一個委託來替我完成
        /// </summary>
        /// <param name="sender">ThreadMethod函數中傳過來的最大值</param>
        /// <param name="e"></param>
        void method_threadStartEvent(object sender, EventArgs e)
        {
            int maxValue = Convert.ToInt32(sender); 
            this.Invoke(new Action<int>(setMax), maxValue);
        }
        /// <summary>
        /// 線程執行中的事件,設置進度條當前進度
        /// 但是我不能直接操作進度條,需要一個委託來替我完成
        /// </summary>
        /// <param name="sender">ThreadMethod函數中傳過來的當前值</param>
        /// <param name="e"></param>
        void method_threadEvent(object sender, EventArgs e)
        {
            int nowValue = Convert.ToInt32(sender); 
            this.Invoke(new Action<int>(setNow), nowValue);
        }
        /// <summary>
        /// 線程完成事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void method_threadEndEvent(object sender, EventArgs e)
        {
            
            MessageBox.Show("執行已經完成!");
            this.Invoke(new Action(setButton));

//只有入參用Action ,如果有返回值用FunC
        }
        public void setButton()
        {
            this.button1.Enabled = true;
        }

        /// <summary>
        /// 我被委託調用,專門設置進度條最大值的
        /// </summary>
        /// <param name="maxValue"></param>
        public void  setMax(int maxValue)
        {
             this.progressBar1.Maximum = maxValue;
            
        }

        /// <summary>
        /// 我被委託調用,專門設置進度條當前值的
        /// </summary>
        /// <param name="nowValue"></param>
        private void setNow(int nowValue)
        {
            this.progressBar1.Value = nowValue;
        }
 public class ThreadMethod
    {
        /// <summary>
        /// 線程開始事件
        /// </summary>
        public event EventHandler threadStartEvent;
        /// <summary>
        /// 線程執行時事件
        /// </summary>
        public event EventHandler threadEvent;
        /// <summary>
        /// 線程結束事件
        /// </summary>
        public event EventHandler threadEndEvent;

        public void runMethod()
        {
            int count = 100;      //執行多少次
            threadStartEvent.Invoke(count, new EventArgs());//通知主界面,我開始了,count用來設置進度條的最大值
            for (int i = 0; i < count; i++)
            {
                Thread.Sleep(100);//休息100毫秒,模擬執行大數據量操作
                threadEvent.Invoke(i, new EventArgs());//通知主界面我正在執行,i表示進度條當前進度
            }
            threadEndEvent.Invoke(new object(), new EventArgs());//通知主界面我已經完成了
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章