C#中子线程操作主线程中窗体上控件的方法
2017-04-15 18:22
609 查看
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(); } } }
相关文章推荐
- C#中子线程操作主线程中窗体上控件的方法
- C#中子线程操作主线程中窗体上控件的方法
- C#中子线程操作主线程中窗体上控件的方法
- C#中子线程操作主线程中窗体上控件的方法
- C#中子线程操作主线程中窗体上控件的方法
- 在C#中子线程如何操作主线程中窗体上控件
- 在C#中子线程如何操作主线程中窗体上控件
- C# 在自定义线程中采用系统委托方式操作主窗体线程控件的方法
- C# 子线程操作主窗体控件的解决方法
- C# 子线程操作主窗体控件的解决方法
- C#中子线程操作主线程中窗体上控件的方法
- C# 跨线程操作控件的线程安全性方法
- C# 类操作窗体控件的方法
- C# 采用系统委托的方式处理线程内操作窗体控件
- C# 引发“线程间操作无效: 从不是创建控件“XXX”的线程访问它” 解决方法
- C# 采用系统委托方式处理线程内操作窗体控件
- C# 子线程调用主线程窗体的解决方法
- 基于APM模式的异步实现及跨线程操作窗体或控件方法的实现示例
- C# 采用系统委托的方式处理线程内操作窗体控件
- C# 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~