C#中子线程操作主线程中窗体上控件的方法
生活随笔
收集整理的這篇文章主要介紹了
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();} } }?
轉載于:https://www.cnblogs.com/test404/p/6715118.html
總結
以上是生活随笔為你收集整理的C#中子线程操作主线程中窗体上控件的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哈希表的理解
- 下一篇: (原创)VS2017 C# 运行 Jav