入门示例: 假如有一个label,我们希望像走马灯一样,从1显示到100

        private void button1_Click(object sender, EventArgs e)
{
for (int i = ; i <= ; i++)
{
label1.Text = i.ToString();
} }

但这种写法,只会卡一下,然后label显示100,没有变化的. 如果用doEvents,就可以变化了

        private void button1_Click(object sender, EventArgs e)
{
for (int i = ; i <= ; i++)
{
label1.Text = i.ToString();
Thread.Sleep();
Application.DoEvents();
} }

但是stackoverflow里说Application.DoEvents是为了适应vb项目迁移而设的,尽量不推荐使用

改成多线程,子线程是不能直接修改UI上的控件的,只能通过委托,让UI线程来修改.

        delegate void D(object obj);
private void button2_Click(object sender, EventArgs e)
{ for (int i = ; i < ; i++)
{
Thread t = new Thread(new ParameterizedThreadStart(SetTextBoxValue));
t.IsBackground = true;
t.Start(i.ToString());
Debug.WriteLine("Thread #"+ i +" Start");
}
} void SetTextBoxValue(object obj)
{
if (label1.InvokeRequired)
{
Debug.WriteLine("Thread #" + obj + "InvokeRequired,set Delegate");
D d = new D(SetTextBoxValue);
label1.Invoke(d, obj); //异步的话,不保证哪个线程先完成.最后的结果是8或9
}
else
{
Debug.WriteLine("Thread #" + obj + " UI Change ");
          //An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
//Additional information: 线程间操作无效: 从不是创建控件“label1”的线程访问它。
this.label1.Text = obj.ToString();
Thread.Sleep(); }
}

debug的输出如下: 启动10个线程.10个线程把修改控件属性的操作交给委托, 最后再UpdateUI

Thread #0 Start
Thread #0InvokeRequired,set Delegate
The thread 0x19ec has exited with code 259 (0x103).
Thread #1 Start
Thread #1InvokeRequired,set Delegate
The thread 0x570 has exited with code 259 (0x103).
Thread #2 Start
Thread #2InvokeRequired,set Delegate
The thread 0x1d04 has exited with code 259 (0x103).
Thread #3 Start
Thread #4 Start
Thread #4InvokeRequired,set Delegate
The thread 0x1a8c has exited with code 259 (0x103).
Thread #5InvokeRequired,set Delegate
Thread #3InvokeRequired,set Delegate
The thread 0x1a88 has exited with code 259 (0x103).
The thread 0xedc has exited with code 259 (0x103).
Thread #5 Start
Thread #6 Start
Thread #7 Start
Thread #7InvokeRequired,set Delegate
Thread #6InvokeRequired,set Delegate
The thread 0x1b58 has exited with code 259 (0x103).
The thread 0x694 has exited with code 259 (0x103).
Thread #8InvokeRequired,set Delegate
The thread 0x1680 has exited with code 259 (0x103).
Thread #8 Start
Thread #9 Start
Thread #0 UI Change
Thread #9InvokeRequired,set Delegate
The thread 0x177c has exited with code 259 (0x103).
Thread #1 UI Change
Thread #2 UI Change
Thread #4 UI Change
Thread #5 UI Change
Thread #3 UI Change
Thread #7 UI Change
Thread #6 UI Change
Thread #8 UI Change
Thread #9 UI Change
The thread 0x67c has exited with code 0 (0x0).

  

多线程学习笔记(一) InvokeRequired 和 delegate的更多相关文章

  1. java多线程学习笔记——详细

    一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

  2. JAVA多线程学习笔记(1)

    JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...

  3. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  4. java进阶-多线程学习笔记

    多线程学习笔记 1.什么是线程 操作系统中 打开一个程序就是一个进程 一个进程可以创建多个线程 现在系统中 系统调度的最小单元是线程 2.多线程有什么用? 发挥多核CPU的优势 如果使用多线程 将计算 ...

  5. Java多线程学习笔记(一)——多线程实现和安全问题

    1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...

  6. java 多线程学习笔记

    这篇文章主要是个人的学习笔记,是以例子来驱动的,加深自己对多线程的理解. 一:实现多线程的两种方法 1.继承Thread class MyThread1 extends Thread{ public ...

  7. Java多线程学习笔记--生产消费者模式

    实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...

  8. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

  9. C# 多线程学习笔记 - 3

    本文主要针对 GKarch 相关文章留作笔记,仅在原文基础上记录了自己的理解与摘抄部分片段. 遵循原作者的 CC 3.0 协议. 如果想要了解更加详细的文章信息内容,请访问下列地址进行学习. 原文章地 ...

随机推荐

  1. 修改postgresql 密码

    sudo -u postgres psql -c "alter user postgres password '123456';"

  2. 讲解web服务所涉及到的重要知识点

    HTTP:超文本传输协议,默认为TCP的80端口.带有超级链接的文本,而这些链接成为超链接! loadrunner :专业级测试工具,模拟你的应用程序的真实,进行评测! HTML:超文本编辑语言. H ...

  3. TeamyinyinFish-> 测试报告

    测试人员 1. 姓名:鱼嘤嘤 2. 年龄: 21 3. 职业: 大三学生 4. 感情状况: 单身 用户故事 软件工程课上,老师想要他们组实现一个小组项目,鱼嘤嘤原本想摸鱼,但是转念一想觉得 还是需要好 ...

  4. [C3] 正则化(Regularization)

    正则化(Regularization - Solving the Problem of Overfitting) 欠拟合(高偏差) VS 过度拟合(高方差) Underfitting, or high ...

  5. 【转】 AOP(面向切面编程)、Filter(过虑器)、Interceptor(拦截器)

    AOP(面向切面编程) 面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承.多态和封装.而封装就要求将功能分散到不同的对象中去,这在软 ...

  6. python实现语音信号处理常用度量方法

    信噪比(SNR) 有用信号功率与噪声功率的比(此处功率为平均功率),也等于幅度比的平方 $$SNR(dB)=10\log_{10}\frac{\sum_{n=0}^{N-1}s^2(n)}{\sum_ ...

  7. Chrome保存整个网页为图片

    打开需要保存为图片的网页 然后按F12,接着按Ctrl+Shift+P 在红框内输入full 点击下面的“Capture full size screenshot”就可以保存整个网页为图片了 原文出处 ...

  8. golang--单元测试综合实例

    实例说明: (1)一个Monster结构体,字段Name,Age,Skill (2)Monster有一个Store方法,可以将一个Monster对象序列化后保存在文件中: (3)Monster有一个R ...

  9. 可能会搞砸你的面试:你知道一个TCP连接上能发起多少个HTTP请求吗?

    本文由原作者松若章原创发布,作者主页:zhihu.com/people/hrsonion/posts,感谢原作者的无私分享. 1.引言 一道经典的面试题是:从 URL 在浏览器被被输入到页面展现的过程 ...

  10. 模型的细致程度--Level of Development

    模型的细致程度,英文称作Level of Details,也叫作Level of Development.描述了一个BIM模型构件单元从最低级的近似概念化的程度发展到最高级的演示级精度的步骤.美国建筑 ...