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#中子线程操作主线程中窗体上控件的方法相关推荐
- MFC子线程访问主线程对话框程序的控件对象
最近在使用 VC 开发软件时需要用到多线程同步来解决开发过程中遇到的问题.本来以为只要象控制台程序一样,在主线程创建子线程,并设置好相应的对象事件就能解决问题,但是等到真正做起来,才在实践中发现原来事 ...
- C# winform中一个类中如何调用另一个窗体的控件或方法
转载地址:http://blog.csdn.net/ichenqingyun/article/details/52622340 一种是创建窗体对象的方式,通过对象调用控件或方法 例如: Form1 f ...
- 在一个窗体中调用另一个窗体的控件或方法(C#)
在一个窗体中调用另一个窗体的控件或方法 解决方案:从构造函数中传递参数(Form). 1.将Form1中的控件改成public属性 具体实现过程请参看一下代码(在form1的textbox1中输入然后 ...
- java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...
之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: ...
- QT开发之调用其它类中的UI控件的方法
比如类A和类B, 在B中有一个QTreeWidget控件,需要在A中调用操作 先在A中声明一个 QTreeWidget *tree; 然后在B中声明一个类A的指针 A *a; a->tree = ...
- c#子线程和主线程创建窗体时顶层显示的区别
主线程 1.设置TopLevel,Topmost,bringfront属性. 子线程 2.在可在Load事件里注册循环设置TopLevel,Topmost,bringTofront属性的方法,如下 f ...
- android listview多线程刷新各自的进度,从另一个线程更新主线程中的ListView
Yar.. 12 我个人使用自定义线程(扩展线程的类),但通过Message发送响应给UI线程.所以在线程的run()函数中有: Message msg; msg = Message.obtain() ...
- C# 子线程中访问主线程中的控件
/** 要想线程操作主线程的控件,首先声明一个委托(delegate)D,* 然后实例化委托d,再然后再子线程中使用this.BeginInvoke(d),* 就可以访问主线程的控件.* */usin ...
- Android中的常用控件之进度条(ProgressBar)
ProgressBar的常用属性 style(进度条的样式,默认为圆形:用style="?android:attr/progressBarStyleHorizontal"可以将进度 ...
最新文章
- 不使用梯度裁剪和使用梯度裁剪的对比(tensorflow)
- Windows中几个内存相当的指标
- 网络推广外包——企业委托网络推广外包公司提高网站流量和访问量
- 创业故事:腾讯的创始人们
- 中继器、集线器、网桥、网关产品介绍
- 窗体控件常用属性 1217
- Tomcat整合APR
- android 输出流对象,Android-IO流之对象操作流ObjectInputStream/ObjectOutputStream
- wxpython窗口跳转_WxPython-用按钮打开一个新窗口
- 周小川:数字人民币不会取代美元 也不会威胁全球货币体系
- Linux 安装 nginx 服务教程
- 微信小程序解析php,微信小程序解析H5文件方法
- 「话题」为什么微信、钉钉撤回消息的时限不同?小米200万改LOGO值不值?
- memcached使用总结篇一
- DVD转VCD,MPG文件参考
- upload.js 文件图片上传
- 线性回归的多重共线性问题及其解决
- 使用Asponse.cells生成图片如何去掉水印
- javascript正则检测用户名验证密码邮箱手机号
- datasets: mnist
热门文章
- 【网址收藏】linux namespace和cgroup
- python3出现module importlib._bootstrap has no attribute SourceFileLoader解决办法
- redis List的用途及常用命令
- redis 日志重写BGREWRITEAOF及混合日志的保存形式
- Scala中的trait特质
- mysql修改主键为自增长碰到的错误
- cordova打包安卓app
- MQTT连接阿里云IoT(四)
- Qt for Android调用android原生Toast控件
- mapstruct 1.4.2 和 lombok 1.18.16 及以上版本结合使用