c# Winfrom窗体事件中启用多线程 并用子线程修改窗体里面的属性
昨天一个朋友问我一个问题,需求是
this.textBox1.Text = "睡眠前";
Thread.Sleep(1000);
this.textBox1.Text = "睡眠后";
他想要的效果就是在显示的时候先显示第一个文本 然后睡眠一秒钟之后 显示第二文本,我们知道在单线程里面 在线程没有结束的时候是不可能显示出任何内容改变的,他的大部分内容还没有被cpu执行完毕,放在堆栈里面,这时候是不可能显示的,那既然提出来了 这边肯定想要解决掉 那只能启动多线程,让主线程先跑完 再让子线程去改 这样就可以解放窗体不能操作的问题了 但是 真的是这样吗
private void button1_Click(object sender, EventArgs e)
{
this.textBox1.Text = "睡眠前";
Task.Run(() => { Thread.Sleep(1000); this.textBox1.Text = "睡眠后"; });
}
我们这样修改一下代码 理论上觉得 可以,但是运行发现 根本没反应,问题出现在哪呢 ,就是子线程修改不动主线程里面的东西,这样一来那我们是不是找到那个主线程 就行了呢
这里我们使用委托
delegate void SetTextCallback(string text);
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
this.textBox1.Text = "睡眠前";
// Task.Run(() => { Thread.Sleep(1000); this.textBox1.Text = "睡眠后"; });
// SetTextCallback SetTextCallback;
// SetTextCallback = SetText;
Task.Run(() => { SetText("睡眠后"); }); }
private void SetText(string text)
{
//子线程睡眠1秒
Thread.Sleep(1000);
if (this.textBox1.InvokeRequired)
{
SetTextCallback Callback = new SetTextCallback(SetText);
this.Invoke(Callback, new object[] { text });
}
else
{
this.textBox1.Text = text;
this.textBox1.Refresh();
}
}
这样 我们通过异步执行,让子线程通过textbook提供的InvokeRequired属性去判断 当前线程是否是在主线程内 不是的话就通过委托回调然到主线程里面去修改属性
以上是我个人理解 如果有什么不对的地方可以和我交流一下
小白留
c# Winfrom窗体事件中启用多线程 并用子线程修改窗体里面的属性的更多相关文章
- Python中的多线程编程,线程安全与锁(二)
在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...
- WCF项目问题2-无法激活服务,因为它需要 ASP.NET 兼容性。没有未此应用程序启用 ASP.NET 兼容性。请在 web.config 中启用 ASP.NET 兼容性,或将 AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode 属性设置为 Required 以外的值。
无法激活服务,因为它需要 ASP.NET 兼容性.没有未此应用程序启用 ASP.NET 兼容性.请在 web.config 中启用 ASP.NET 兼容性,或将 AspNetCompatibility ...
- C#多线程编程实例 线程与窗体交互
C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = ]; public ...
- vc中主线程等待子线程退出的方法
VC线程同步,在子线程中等待另一子线程结束,通过WaitForSingleObject可以实现,但是如果在主线程中等待子线程结束,这个函数是无法完成要求的,因为它会造成主线程挂起,导致程序死掉.我们可 ...
- VC中利用多线程技术实现线程之间的通信
当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...
- 2016/1/2 Python中的多线程(1):线程初探
---恢复内容开始--- 新年第一篇,继续Python. 先来简单介绍线程和进程. 计算机刚开始发展的时候,程序都是从头到尾独占式地使用所有的内存和硬件资源,每个计算机只能同时跑一个程序.后来引进了一 ...
- Python中的多线程编程,线程安全与锁(一)
1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...
- GCD多线程 在子线程中获取网络图片 在主线程更新
子线程中得所有数据都可以直接拿到主线程中使用 //当触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示 -(void)touchesBegan:(NSSet *)touches withEv ...
- python多线程获取子线程任务返回值
今天想实现多线程更新资产信息,所以使用到了threading,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装 def auto_asset(node): re ...
随机推荐
- Getting Started with Word2Vec
Getting Started with Word2Vec 1. Source by Google Project with Code: https://code.google.com/archive ...
- 复旦大学2017--2018学年第二学期(17级)高等代数II期末考试第六大题解答
六.(本题10分) 设 $A$ 为 $n$ 阶幂零阵 (即存在正整数 $k$, 使得 $A^k=0$), 证明: $e^A$ 与 $I_n+A$ 相似. 证明 由 $A$ 是幂零阵可知, $A$ ...
- flutter插件汇总
audio_recorder: any #录音.播放 flutter_sound: ^#录音 dropdown_menu: ^#下拉菜单 simple_permissions:#权限获取 easy_a ...
- (转)Illustrated: Efficient Neural Architecture Search ---Guide on macro and micro search strategies in ENAS
Illustrated: Efficient Neural Architecture Search --- Guide on macro and micro search strategies in ...
- transform:rotate3d/tranlate3d
transform:rotate3d(x,y,z,angle); rotate3d 代表 在3D空间,元素沿着 经过原点(0,0,0) 和 三维坐标(x,y,z) 2点的直线进行旋转.其中: x:是一 ...
- 使用RStudio调试(debug)基础学习(二)和fGarch包中的garchFit函数估计GARCH模型的原理和源码
一.garchFit函数的参数--------------------------------------------- algorithm a string parameter that deter ...
- day4——无重复字符的最长子串
// 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第2题 今日算法 题干 //给定一个字符串,请你找出其中不含有重复字符的 最长子串 ...
- SQL Server 视图(仅代码及练习)
use electric go --建立供电局1#仓库所存放物资的视图. create view s1_stock as select * from stock where warehouse='供电 ...
- POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum
http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...
- docker-compose的使用
docker-compose的介绍 Compose是一个定义和管理多容器的工具,使用Python语言编写.使用Compose配置文件描述多个容器应用的架构,比如使用什么镜像.数据卷.网络.映射端口等; ...