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#中子线程操作主线程中窗体上控件的方法相关推荐

  1. MFC子线程访问主线程对话框程序的控件对象

    最近在使用 VC 开发软件时需要用到多线程同步来解决开发过程中遇到的问题.本来以为只要象控制台程序一样,在主线程创建子线程,并设置好相应的对象事件就能解决问题,但是等到真正做起来,才在实践中发现原来事 ...

  2. C# winform中一个类中如何调用另一个窗体的控件或方法

    转载地址:http://blog.csdn.net/ichenqingyun/article/details/52622340 一种是创建窗体对象的方式,通过对象调用控件或方法 例如: Form1 f ...

  3. 在一个窗体中调用另一个窗体的控件或方法(C#)

    在一个窗体中调用另一个窗体的控件或方法 解决方案:从构造函数中传递参数(Form). 1.将Form1中的控件改成public属性 具体实现过程请参看一下代码(在form1的textbox1中输入然后 ...

  4. java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...

    之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: ...

  5. QT开发之调用其它类中的UI控件的方法

    比如类A和类B, 在B中有一个QTreeWidget控件,需要在A中调用操作 先在A中声明一个 QTreeWidget *tree; 然后在B中声明一个类A的指针 A *a; a->tree = ...

  6. c#子线程和主线程创建窗体时顶层显示的区别

    主线程 1.设置TopLevel,Topmost,bringfront属性. 子线程 2.在可在Load事件里注册循环设置TopLevel,Topmost,bringTofront属性的方法,如下 f ...

  7. android listview多线程刷新各自的进度,从另一个线程更新主线程中的ListView

    Yar.. 12 我个人使用自定义线程(扩展线程的类),但通过Message发送响应给UI线程.所以在线程的run()函数中有: Message msg; msg = Message.obtain() ...

  8. C# 子线程中访问主线程中的控件

    /** 要想线程操作主线程的控件,首先声明一个委托(delegate)D,* 然后实例化委托d,再然后再子线程中使用this.BeginInvoke(d),* 就可以访问主线程的控件.* */usin ...

  9. Android中的常用控件之进度条(ProgressBar)

    ProgressBar的常用属性 style(进度条的样式,默认为圆形:用style="?android:attr/progressBarStyleHorizontal"可以将进度 ...

最新文章

  1. 不使用梯度裁剪和使用梯度裁剪的对比(tensorflow)
  2. Windows中几个内存相当的指标
  3. 网络推广外包——企业委托网络推广外包公司提高网站流量和访问量
  4. 创业故事:腾讯的创始人们
  5. 中继器、集线器、网桥、网关产品介绍
  6. 窗体控件常用属性 1217
  7. Tomcat整合APR
  8. android 输出流对象,Android-IO流之对象操作流ObjectInputStream/ObjectOutputStream
  9. wxpython窗口跳转_WxPython-用按钮打开一个新窗口
  10. 周小川:数字人民币不会取代美元 也不会威胁全球货币体系
  11. Linux 安装 nginx 服务教程
  12. 微信小程序解析php,微信小程序解析H5文件方法
  13. 「话题」为什么微信、钉钉撤回消息的时限不同?小米200万改LOGO值不值?
  14. memcached使用总结篇一
  15. DVD转VCD,MPG文件参考
  16. upload.js 文件图片上传
  17. 线性回归的多重共线性问题及其解决
  18. 使用Asponse.cells生成图片如何去掉水印
  19. javascript正则检测用户名验证密码邮箱手机号
  20. datasets: mnist

热门文章

  1. 【网址收藏】linux namespace和cgroup
  2. python3出现module importlib._bootstrap has no attribute SourceFileLoader解决办法
  3. redis List的用途及常用命令
  4. redis 日志重写BGREWRITEAOF及混合日志的保存形式
  5. Scala中的trait特质
  6. mysql修改主键为自增长碰到的错误
  7. cordova打包安卓app
  8. MQTT连接阿里云IoT(四)
  9. Qt for Android调用android原生Toast控件
  10. mapstruct 1.4.2 和 lombok 1.18.16 及以上版本结合使用