在写winform程序时候,如果时间长的操作不用线程操作。那么会卡死UI,点击界面就体现为未响应。为此需要对耗时操作用线程处理,比如检验的监听程序就是一个死循环,不停检查文件夹或数据库又没有数据,然后上传。如果不时有线程,在数据多的情况,程序是基本点不动的,这样体验就很不好。

1.首先拖个文本框准备用线程给里面写文本

2.测试代码,创建一个线程,直接操作UI控件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;namespace ThreadUI
{public partial class Form1 : Form{public Form1(){InitializeComponent();}/// <summary>/// 加载方法/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_Load(object sender, EventArgs e){//用线程写文本Thread t = new Thread(WriteTxt);t.Start();}/// <summary>/// 写文本/// </summary>public void WriteTxt(){for(int i=0;i<100;i++){richTextBox1.Text += "第" + i + "行\n";}}}
}

3.运行报错,这里报错不能从线程访问UI控件

那么对于线程运行长时间操作,想和UI交互怎么办呢?

这里需要用委托解决线程和UI交互:
1.先定义一个委托
2.把操作UI的方法再用委托包一层
3.线程调用包装的方法

调整代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;namespace ThreadUI
{/// <summary>/// 写日志委托/// </summary>/// <param name="info"></param>public delegate void WriteInfoDelegate(string info);public partial class Form1 : Form{public Form1(){InitializeComponent();}/// <summary>/// 加载方法/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_Load(object sender, EventArgs e){//用线程写文本Thread t = new Thread(WriteTxt);t.Start();}/// <summary>/// 写日志代理方法/// </summary>/// <param name="info"></param>public void WriteInfoProxy(string info){//组装参数object[] paras = new object[] { info };//在UI线程执行委托this.Invoke(new WriteInfoDelegate(SetTxt), paras);}/// <summary>/// 操作控件逻辑/// </summary>/// <param name="info"></param>public void SetTxt(string info){richTextBox1.Text += info;}/// <summary>/// 写文本/// </summary>public void WriteTxt(){for(int i=0;i<100;i++){WriteInfoProxy("第" + i + "行\n");}}}
}

就不会异常了

C#的委托我理解为函数指针,和C及C++里的指针不同的是他类型化更明显了。什么类型的委托可以初始化什么类型的方法委托变量。这样就可以把函数指针到处传递了。在子弹窗触发父窗体刷新等也基于委托调用也是一个很好的方式。千万别到父页面搞个静态方法这种方式给子页面调额。这种太死了,借助委托可以把方法层层传递给任何要调用的地方。

iMedicalLIS监听程序的基础就基于线程和委托来实现异步,防止卡UI。

C#线程操作UI控件相关推荐

  1. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...

  2. C# WinForm跨线程访问UI控件

    C# 跨线程访问控件 在做WinForm时,在UI线程之外调用控件会报异常:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"l ...

  3. C# 采用系统委托的方式处理线程内操作窗体控件(转载)

    C# 采用系统委托的方式处理线程内操作窗体控件 C# / asp.net / j 2009-12-25 10:04:47 阅读138 评论0   字号:大中小 订阅 一.System.Windows. ...

  4. C#跨线程调用窗体控件的问题

    前段时间遇到跨线程调用窗体控件的问题,其实一句话System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;就可以解决,但 ...

  5. QT-子线程或自定义类操作访问主界面UI控件的几种方法

    前言 QT创建窗体工程,一般在MainWindow或Dialog类里可以直接通过ui指针访问控件,但是添加新的类后又如何访问呢,可以通过以下几种方式: 1.将ui指针公开后直接访问 (1)例如有个自己 ...

  6. c#,c++,qt中多线程访问UI控件线程的问题汇总

    c#和MFC中可以创建UI控件及模态/非模态对话框,Qt中只能在主UI线程中创建访问UI控件. c#和MFC中可以通过全局变量或指针句柄等方式在工作线程中访问其他UI线程控件,其中c#需要Invoke ...

  7. android 根据bounds坐标进行点击操作_炫酷的Android时钟UI控件,隔壁产品都馋哭了...

    废话不多说,先上效果效果酷炫,动画丰富,效果爆炸boom-设计思路看腻了市面上各种丑陋难看的时钟控件,是时候整点新活!将现实生活中的摆钟圆形表盘设计.电子手表的数显表盘设计抽象出来,提取出" ...

  8. C#多线程操作界面控件的解决方案

    C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...

  9. winform中更新UI控件的方案介绍

    这是一个古老的话题...直入主题吧! 对winfrom的控件来说,多线程操作非常容易导致复杂且严重的bug,比如不同线程可能会因场景需要强制设置控件为不同的状态,进而引起并发.加锁.死锁.阻塞等问题. ...

最新文章

  1. Quartus和Modelsim中使用`include包含头文件的对比
  2. java实现的代理的两种办法
  3. Vue parse之 从template到astElement 源码详解
  4. c# static那些事
  5. python基础30个常用代码-30个Python常用极简代码,拿走就用
  6. 去重 属性_亿万级海量数据去重软方法,spark/flink/mr等通用
  7. javaweb网上鞋店
  8. python pip 下载
  9. Ubuntu下安装使用Monaco字体
  10. 自动化测试项目实战训练【广州8月】
  11. 推荐几个免费下载破解软件的网站
  12. 2021年全国居住场所火灾死亡人数、受伤人数、火灾发生原因及造成直接财产损失分析[图]
  13. 如何删除剽悍的应用软件
  14. 【计算机网络】实验3:虚拟机配置测试实验
  15. Retrofit 2.0 轻松实现多文件/图片上传/Json字符串/表单
  16. 2020-09-18 python中copy()和deepcopy()详解
  17. C#导出Word总结
  18. 搜狐畅游2021届校园招聘简章
  19. 【iOS开发-动画】iOS开发动画实现合集
  20. 免费Java游戏源代码素材推荐

热门文章

  1. [WCN685X] WCN6856 WiFi 6E设置Open连接失败问题分析及解决方案
  2. ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测
  3. ios 应用内跳转微信
  4. VS2012最新特性
  5. 网络ghost使用教程 网络克隆操作实例
  6. 去除overflow:scroll时的浏览器滑条
  7. 破坏计算机网络信息罪,破坏计算机信息系统危害网络安全怎么量刑
  8. tankbot 机器人_每日一败:梦幻童年?这个TankBot机器人能搞定
  9. 安卓下Kindle导入本地电子书的方法
  10. putty 的下载,免费分享