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