昨天一个朋友问我一个问题,需求是

            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窗体事件中启用多线程 并用子线程修改窗体里面的属性的更多相关文章

  1. Python中的多线程编程,线程安全与锁(二)

    在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...

  2. WCF项目问题2-无法激活服务,因为它需要 ASP.NET 兼容性。没有未此应用程序启用 ASP.NET 兼容性。请在 web.config 中启用 ASP.NET 兼容性,或将 AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode 属性设置为 Required 以外的值。

    无法激活服务,因为它需要 ASP.NET 兼容性.没有未此应用程序启用 ASP.NET 兼容性.请在 web.config 中启用 ASP.NET 兼容性,或将 AspNetCompatibility ...

  3. C#多线程编程实例 线程与窗体交互

    C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = ]; public ...

  4. vc中主线程等待子线程退出的方法

    VC线程同步,在子线程中等待另一子线程结束,通过WaitForSingleObject可以实现,但是如果在主线程中等待子线程结束,这个函数是无法完成要求的,因为它会造成主线程挂起,导致程序死掉.我们可 ...

  5. VC中利用多线程技术实现线程之间的通信

    当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...

  6. 2016/1/2 Python中的多线程(1):线程初探

    ---恢复内容开始--- 新年第一篇,继续Python. 先来简单介绍线程和进程. 计算机刚开始发展的时候,程序都是从头到尾独占式地使用所有的内存和硬件资源,每个计算机只能同时跑一个程序.后来引进了一 ...

  7. Python中的多线程编程,线程安全与锁(一)

    1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...

  8. GCD多线程 在子线程中获取网络图片 在主线程更新

    子线程中得所有数据都可以直接拿到主线程中使用 //当触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示 -(void)touchesBegan:(NSSet *)touches withEv ...

  9. python多线程获取子线程任务返回值

    今天想实现多线程更新资产信息,所以使用到了threading,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装 def auto_asset(node): re ...

随机推荐

  1. java四则运算 界面化

    本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2232 项目的地址:https://github.com/kdays ...

  2. CAS工程用redis集群存储票据ticket Spring整合

    maven jar包版本: <dependency> <groupId>redis.clients</groupId> <artifactId>jedi ...

  3. [php] 添加接口访问日志(文件)

    日志参数: 请求参数,请求地址,响应结果 步骤: 1. 定义日志目录,没有的需要创建 2. 定义日志名称 3. 以追加的形式写入日志文件  FILE_APPEND public function ad ...

  4. 在多机器上远程执行JMeter

    安装完jmeter之后直接执行%InstallDir%\apache-jmeter-3.2\bin\JMeter.bat可以启动UI界面,可以编辑或者执行TestPlan等,默认情况下,用例是在本机执 ...

  5. 网络流(dinic算法)

    网络最大流(dinic) 模型 在一张图中,给定一个源点s,给定汇点t,点之间有一些水管,每条水管有一个容量,经过此水管的水流最大不超过容量,问最大能有多少水从s流到t(s有无限多的水). 解法 di ...

  6. H5外包团队 技术分享 基于H5+的项目分享

    项目截图:             有H5项目需求欢迎联系我们 我们提供免费的项目评估报价 QQ:372900288 WX:Liuxiang0884

  7. shell for 循环

    test.sh #!/bin/bash for str in "C语言" "http://www.bilibili.com" "成立7年了" ...

  8. 用 jupyter notebook 打开 oui.txt 文件出现的问题及解决方案

    问题背景:下载了2018 IEEE 最新的 oui.txt 文件.里面包含了 设备 MAC 地址的前六位对应的厂商.要做的工作是,将海量设备的 MAC 地址与 oui.txt 文件的信息比对,统计出 ...

  9. UI组件--element-ui合计行在横向滚动条下面的解决方法

    使用element-ui合计功能, 因列数较多, 产生横向滚动条: 但是合计行却在滚动条下面, 拖动滚动条合计行不会跟着横向滚动. 在当前页面添加以下样式: <style lang='less' ...

  10. YY的GCD

    YY的GCD 给出T个询问,询问\(\sum_{i=1}^N\sum_{j=1}^M(gcd(i,j)\in prime)\),T = 10000,N, M <= 10000000. 解 显然质 ...