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 > )
{
//编列自定义队列,将所有线程终止
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#中子线程操作主线程中窗体上控件的方法的更多相关文章
- 在C#中子线程如何操作主线程中窗体上控件
在C#中,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能 简单的通过控件对象名来操作,但不是说不能进行操作,微软 ...
- C# 线程调用主线程中的控件
由于项目的需要,最近几天一直在做串口和数据库.由于C#使用的时间不长,所以在编写代码和调试的过程中总是遇到意想不到的问题,比如在使用串口接收数据的时候,在接收数据事件中想把接收的数据放入一个textb ...
- python 多线程中子线程和主线程相互通信
主线程开启多个线程去干活,每个线程需要完成的时间不同,干完活以后都要通知给主线程,下面代码说明该应用: 代码块: import threading import queue import time i ...
- Android中,子线程使用主线程中的组件出现问题的解决方法
Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行 ...
- VC中添加web控件的方法
在VC中使用WebBrowser控件的两方法 黄森堂(vcmfc)著 ClassWizard方式: 1.创建包装类:View->ClassWizard->Add Class->For ...
- C#学习之在辅助线程中修改UI控件----invoke方法
Invoke and BeginInvoke 转载地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 在Invo ...
- WinForm------GridControl控件中使用SearchLookUpEdit控件的方法
1.在数据库添加两张表,拥有主外键关系 主键表: 外键表: 2.往工具栏里拖出GridCont控件,并增加相应的列,这里对"省份"进行修改,"FileName" ...
- .Net遍历窗体上控件
实现遍历窗体上的控件以及找出TextBox控件,代码如下: foreach( Control control in this.Controls ) { if( control is TextBox ) ...
- Android中的常用控件之进度条(ProgressBar)
ProgressBar的常用属性:style,进度条的样式,默认为圆形,用style="?android:attr/progressBarStyleHorizontal"可以将进度 ...
随机推荐
- OA实例
let express = require('express'); let consolidate = require('consolidate'); let bodyParser = require ...
- 普通PC安装ESXi5.5以及以上的方法
原贴内容 With ESXi 5, ESX no longer uses MBR for boot, it has gone to GPT-based partitions instead. W ...
- [读书笔记]Linux命令行与shell编程读书笔记04 安装软件,编辑器注意事项
1. debian以及redhat两种主流的linux发行版用的包管理工具 debian的包管理工具是 dpkg 再现安装的是 apt apt的工具主要有 apt-get apt-cache apti ...
- 无法定位程序输入点 zend_empty_string php7.dll
phpstudy 在安装php_redis.dll php_redis.pdb 时,需要用到php_igbinary.dll扩展.但我下载的版本不对.下载的是7.2版本的. 所以报以上错误.可选择版本 ...
- PP模块的主要功能及标准业务流程
主要功能:1.SOP (Sales and operations Planning).2.资源分配计划划 (Distribution Resource Planning)3.生产计划编制 (Produ ...
- html 佈局
html常見佈局方式有以下幾種: 1.使用div的html 利用div可以為html實現多列佈局. 2.使用html5的網站佈局, 利用html新增的header.footer.nav.section ...
- 牛客网练习赛7-B-购物
在遥远的东方,有一家糖果专卖店. 这家糖果店将会在每天出售一些糖果,它每天都会生产出m个糖果,第i天的第j个糖果价格为C[i][j]元. 现在的你想要在接下来的n天去糖果店进行选购,你每天可以买多个糖 ...
- ELK--filebeat命令行参数解释
./filebeat 使用-c命令行上的标志设置要加载的配置文件,可以通过重复-c标志来指定多个配置文件, 可以使用覆盖个别设置-E <setting>=<value>.< ...
- Codeforces Round #412 C. Success Rate
C. Success Rate time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Spring事务说明与自实现
要使用Springboot的事务其实非常简单,在启动类上添加@EnableTransactionManagement,在Service的类或者方法上使用@Transactional就可以了. 事务本身 ...