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 > )
{
//编列自定义队列,将所有线程终止
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[].Text = iIndex.ToString();
lvi.SubItems.Add(strMsg);
this.lstMain.Items.Insert(, 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 = ; i < ; i++)
{
DispMsg(i + , "Welcome you : " + (i + ).ToString());
Thread.Sleep();
}
} /***************************************************** 定义该类的事件处理函数 ****************************************************/ /// <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#中子线程操作主线程中窗体上控件的方法的更多相关文章

  1. 在C#中子线程如何操作主线程中窗体上控件

    在C#中,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能 简单的通过控件对象名来操作,但不是说不能进行操作,微软 ...

  2. C# 线程调用主线程中的控件

    由于项目的需要,最近几天一直在做串口和数据库.由于C#使用的时间不长,所以在编写代码和调试的过程中总是遇到意想不到的问题,比如在使用串口接收数据的时候,在接收数据事件中想把接收的数据放入一个textb ...

  3. python 多线程中子线程和主线程相互通信

    主线程开启多个线程去干活,每个线程需要完成的时间不同,干完活以后都要通知给主线程,下面代码说明该应用: 代码块: import threading import queue import time i ...

  4. Android中,子线程使用主线程中的组件出现问题的解决方法

    Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行 ...

  5. VC中添加web控件的方法

    在VC中使用WebBrowser控件的两方法 黄森堂(vcmfc)著 ClassWizard方式: 1.创建包装类:View->ClassWizard->Add Class->For ...

  6. C#学习之在辅助线程中修改UI控件----invoke方法

    Invoke and BeginInvoke 转载地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 在Invo ...

  7. WinForm------GridControl控件中使用SearchLookUpEdit控件的方法

    1.在数据库添加两张表,拥有主外键关系 主键表: 外键表: 2.往工具栏里拖出GridCont控件,并增加相应的列,这里对"省份"进行修改,"FileName" ...

  8. .Net遍历窗体上控件

    实现遍历窗体上的控件以及找出TextBox控件,代码如下: foreach( Control control in this.Controls ) { if( control is TextBox ) ...

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

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

随机推荐

  1. PAT 1011 A+B和C

    https://pintia.cn/problem-sets/994805260223102976/problems/994805312417021952 给定区间[-2^31^, 2^31^]内的3 ...

  2. realm vs. domain

    从wiki的角度:https://wikidiff.com/domain/realm domain是物理的,realm是抽象的,都是领域. domain是一个人或组织拥有或控制的地理区域,而realm ...

  3. vue为app做h5页面,如何做到同域名对应不同版本的h5代码

    1.当我们在做混合开发的时候,app端可以有无数多个版本,一般情况h5页面只有一套代码.应该如何部署多套代码呢? 2.业务场景 当出现这种情况的时候,其实前端可以部署多套代码.比如: www.stat ...

  4. Java并发—synchronized关键字

    synchronized关键字的作用是线程同步,而线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. synchronized用法 1. 在需要同步的方法的方法签名中加入synchro ...

  5. 几种实现one-hot编码的方式

    方法1 之前写使用sklearn进行数据挖掘-房价预测(4)-数据预处理一文中处理标签类特征时候已经提到过,使用sklearn中提供的LabelEncoder和OneHotEncoder方法 a = ...

  6. GROUP BY 聚合函数(max min sum avg count) 和HAVING的 使用

    重新复习一下这个都源自于我经常需要查的一个需求 “要找到表里面 出现了两次或者三次的某个字段” 现在假设有一张表字段是 +----+---------------------+------------ ...

  7. 如何使用grep 等命令快速的在日志中找到自己需要的内容

    虽然使用linux也有好几年了,但是服务器端开发的活儿正经来算才干不到一年. 一直没有需求和机会会去花大量的时间排查日志啥的,直到我摊上了大事t t,写的代码在线上出了bug需要排查问题. grep可 ...

  8. 监控系统 & monitoring & DevOps

    监控系统 & monitoring & DevOps https://github.com/topics/monitoring https://github.com/marketpla ...

  9. Java微信二次开发(九)

    多媒体文件上传与下载 第一步:找到包com.wtz.vo,新建类WeixinMedia.java package com.wtz.vo; /** * @author wangtianze QQ:864 ...

  10. ef 仓储模式

    构建一个仓储模式. Model 大家自己创建就行了,上个图,就不多说了(我是code first) IDAL namespace IDAL { public interface IBaseReposi ...