C#子线程更新UI控件的方法实例总结
作者:shichen2014 发布时间:2022-08-31 15:40:23
本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值。分享给大家供大家参考之用。具体分析如下:
一般在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从子线程直接修改控件属性时会出现“从不是创建控件的线程访问它”的异常提示。
跨线程更新UI控件的常用方法有两种:
1.使用控件自身的invoke/BeginInvoke方法
2.使用SynchronizationContext的Post/Send方法更新
具体实现如下:
1.使用控件自身的invoke/BeginInvoke方法
Control类实现了ISynchronizeInvoke 接口,我们看该接口的定义:
Control类的invoke方法有两个实现
Object Invoke(Delegate); //在拥有此控件的基础窗口句柄的线程上执行指定的委托
Object Invoke(Delegate,Object[] );
可以看出继承Control类的UI控件都可以使用Invoke方法异步更新。以下代码段实现在子线程中更新Label控件的Text属性
private void button6_Click(object sender, EventArgs e)
{
Thread demoThread =new Thread(new ThreadStart(threadMethod));
demoThread.IsBackground = true;
demoThread.Start();//启动线程
}
void threadMethod()
{
Action<String> AsyncUIDelegate=delegate(string n){label1.Text=n;};/<span style="font-family: Arial, Helvetica, sans-serif;">/定义一个委托</span>
label1.Invoke(AsyncUIDelegate,new object[]{"修改后的label1文本"});
}
2.使用SynchronizationContext的Post/Send方法更新
SynchronizationContext类在System.Threading命令空间下,可提供不带同步的自由线程上下文,其中Post方法签名如下:
public virtual void Post(SendOrPostCallback d,Object state) //将异步消息调度到一个同步上下文
可以看出我们要异步更新UI控件,第一是要获取UI线程的上下文了,第二就是调用post方法了,代码实现:
SynchronizationContext _syncContext = null;
private void button6_Click(object sender, EventArgs e)
{
Thread demoThread =new Thread(new ThreadStart(threadMethod));
demoThread.IsBackground = true;
demoThread.Start();//启动线程
}
//窗体构造函数
public Form1()
{
InitializeComponent();
//获取UI线程同步上下文
_syncContext = SynchronizationContext.Current;
}
private void threadMethod()
{
_syncContext.Post(SetLabelText, "修改后的文本");//子线程中通过UI线程上下文更新UI
}
private void SetLabelText(object text)
{
this.lable1.Text = text.ToString();
}
希望本文所述对大家的C#程序设计有所帮助
猜你喜欢
- JOL简介JOL的全称是Java Object Layout。是一个用来分析JVM中Object布局的小工具。包括Object在内存中的占用
- * 的工作原理如图 * 是由每一个action请求(request)都包装在一系列的 * 的内部,通过redirectAction再一次
- 一、统一全站字符编码通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题package me.gacl
- 面试题1:谈一下你对 Nginx 的理解Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP
- 1.Shito简介1.1 什么是shiroApache Shiro是一个java安全(权限)框架Shiro可以非常容易的开发出足够好的应用,
- 1.字符串值中包含E等科学计数法,比如12E-2,需要进行转化为普通数值0.12,2.转化函数如下: private Decima
- 最近 IDEA 2020最后一个版本发布了 ,已经内置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中内置
- java POI合并两个word文档有需要的可以将主函数中写死的地方改为一个Listimport java.io.FileInputStre
- Java中List.of()和Arrays.asList()的区别及原因动手写一下,让自己更有印象1.Arrays.asList()可以插入
- 项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发概述要使用@Scheduled注解,
- 一、使用@Profile1.1、@Profile修饰类开发环境package com.example.demo.config;import
- 熬夜写完,尚有不足,但仍在努力学习与总结中,而您的点赞与关注,是对我最大的鼓励!在一些本地化项目开发当中,存在这样一种需求,即开发完成的项目
- idea手动刷新git分支相信很多小伙伴都遇到过这样的问题,在git上新建的分支却在idea的git分支中找不到又不知在哪里刷新,博主最近也
- 目录Mybatis简介Mybatis开发步骤:Mybatis的映射文件概述Mybatis的增删改查操作MyBatis的核心配置文件概述MyB
- SpringMVC @RequestBody的使用Spring mvc是一个非常轻量的mvc框架,注解可以大大减少配置,让请求的拦截变得比较
- 实例如下:package com.bwsk.modules.weixin.util;import java.util.Random;/**
- 背景今天面试字节算法岗时被问到的问题,让我用C++实现一个softmax函数。softmax是逻辑回归在多分类问题上的推广。大概的公式如下:
- 本文实例为大家分享了Java流布局图形界面编写代码,供大家参考,具体内容如下package jisuanqi;import java.awt
- 1. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们
- 在本文中,笔者向大家介绍下Java中一个非常重要也非常有趣的特性,就是自动装箱与拆箱,并从源码中解读自动装箱与拆箱的原理,同时这种特性也留有