C#中子線程操作主線程中窗體上控件的方法


Demo

this.listView1.Visible = true;
            this.listView1.BeginUpdate();this.listView1.EndUpdate();  //結束數據處理,UI界面一次性繪制

 

using System;
using System.Collections.Generic;
using System.Windows.Forms;

using System.Threading;

namespace 子線程操作主線程窗體上的控件
{
    public partial class frmMain : Form
    {
        /***************************************************** 定義該類的私有成員 ****************************************************/
        
        /// <summary>
        /// 定義一個隊列,用於記錄用戶創建的線程
        /// 以便在窗體關閉的時候關閉所有用於創建的線程
        /// </summary>
        private List<Thread> ChaosThreadList;

        /***************************************************** 該類的初始化相關函數 ****************************************************/
                
        /// <summary>
        /// 窗體的初始化函數,初始化線程隊列ChaosThreadList
        /// </summary>
        public frmMain()
        {
            InitializeComponent();
            ChaosThreadList = new List<Thread>();
        }
               
        /// <summary>
        /// 窗體的關閉事件處理函數,在該事件中將之前創建的線程全部終止
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (ChaosThreadList.Count > 0)
            {
                //編列自定義隊列,將所有線程終止
                foreach (Thread tWorkingThread in ChaosThreadList)
                {
                    tWorkingThread.Abort();
                }
            }
        }        

        /***************************************************** 定義該類的自定義函數 ****************************************************/

        /// <summary>
        /// 定義一個代理
        /// </summary>
        /// <param name="index"></param>
        /// <param name="MSG"></param>
        private delegate void DispMSGDelegate(int index,string MSG);

        /// <summary>
        /// 定義一個函數,用於向窗體上的ListView控件添加內容
        /// </summary>
        /// <param name="iIndex"></param>
        /// <param name="strMsg"></param>
        private void DispMsg(int iIndex,string strMsg)
        {
            if (this.lstMain.InvokeRequired==false)                      //如果調用該函數的線程和控件lstMain位於同一個線程內
            {
                //直接將內容添加到窗體的控件上
                ListViewItem lvi = new ListViewItem();
                lvi.SubItems[0].Text = iIndex.ToString();
                lvi.SubItems.Add(strMsg);
                this.lstMain.Items.Insert(0, lvi);
            }
            else                                                        //如果調用該函數的線程和控件lstMain不在同一個線程
            {
                //通過使用Invoke的方法,讓子線程告訴窗體線程來完成相應的控件操作
                DispMSGDelegate DMSGD = new DispMSGDelegate(DispMsg);

                //使用控件lstMain的Invoke方法執行DMSGD代理(其類型是DispMSGDelegate)
                this.lstMain.Invoke(DMSGD, iIndex, strMsg);
                
            }
        }

        /// <summary>
        /// 定義一個線程函數,用於循環向列表中添加數據
        /// </summary>
        private void Thread_DisplayMSG()
        {
            for (int i = 0; i < 10000; i++)
            {
                DispMsg(i + 1, "Welcome you : " + (i + 1).ToString());
                Thread.Sleep(10);
            }
        }

        /***************************************************** 定義該類的事件處理函數 ****************************************************/

        /// <summary>
        /// 【開始】按鈕的單擊事件處理函數,新建一個線程向窗體上的ListView控件填寫內容
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBegin_Click(object sender, EventArgs e)
        {
            //創建一個新的線程
            Thread tWorkingThread = new Thread(Thread_DisplayMSG);

            //將新建的線程加入到自定義線程隊列中,以便在窗體結束時關閉所有的線程
            ChaosThreadList.Add(tWorkingThread);

            //開啟線程
            tWorkingThread.Start();
        }     

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM