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. FZU软工实践–团队成员交换交接情况

    0.前言 本次交接主要是为了之后Beta冲刺工作可以更加顺利而进行的.因为我跟其他队友交互不够方便,而且我们项目当前比较缺做前端的人员,后端功能已基本实现.所以我换出来了.希望大家可以顺顺利利做完一步 ...

  2. Effective C++(第三版)笔记 ---- 第一部分让自己习惯C++

    内容从侯捷译版的<Effective C++>(第三版)摘录 条款一 C++作为一个多种范式融合的语言,可以看成是语言的联邦,它包含了一下四种主要的次语言: C.C++以C为基础,很多时候 ...

  3. [转帖] iptables之四表五链

    iptables之四表五链 http://www.cnblogs.com/clouders/p/6544584.html mark 学习一下 对防火墙一无所知.. iptables可谓是SA的看家本领 ...

  4. string、const char*、 char* 、char[]相互转换

    转化总结如下: 目标格式 源格式 string const char* char* char[] string NULL const char*=string.c_str(); const char* ...

  5. html DOM導航

    getElementByTagname()獲取所有相同標籤的節點列表,length表示節點的長度: lastchild表示最後一個子節點,firstchild表示第一個子節點,parentnode表示 ...

  6. BZOJ3724 PA2014Final Krolestwo(欧拉回路+构造)

    如果没有长度为偶数的限制,新建一个点向所有奇点连边,跑欧拉回路即可,显然此时一定存在欧拉回路,因为所有点度数都为偶数. 考虑长度为偶数的限制,将每个点拆成两个点放进一个二分图里,那么每条原图中的边在二 ...

  7. python构建bp神经网络_曲线拟合(一个隐藏层)__2.代码实现

    IDE:jupyter 抽象程度可能不是那么高,以后再优化. 理论和代码实现的差距还是挺大的 数据集请查看 python构建bp神经网络(一个隐藏层)__1.数据可视化 部分代码预览 git上传.ip ...

  8. 06 自学Aruba之win7系统802.1x认证网卡设置指导

    点击返回:自学Aruba之路 06 自学Aruba之win7系统802.1x认证网卡设置指导 步骤1.在桌面任务栏找到“打开网络和共享中心”,点击进入: 步骤2.点击“管理无线网络”,进入无线网络配置 ...

  9. 配置AD RMS及SharePoint 2013 IRM问题解决及相关资源

    最近配置AD RMS及SharePoint 2013 IRM遇到几个问题: 1. RMS配置好后,client端连不上, 一直要求输入用户名和密码. 后来换了台不是SP的机器,并用内部DB,搞定.   ...

  10. 洛谷P1850 换教室

    令人印象深刻的状态转移方程... f[i][j][0/1]表示前i个换j次,第i次是否申请时的期望. 注意可能有重边,自环. 转移要分类讨论,距离是上/这次成功/失败的概率乘相应的路程. 从上次的0/ ...