多线程学习笔记(一) InvokeRequired 和 delegate
入门示例: 假如有一个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的更多相关文章
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- java进阶-多线程学习笔记
多线程学习笔记 1.什么是线程 操作系统中 打开一个程序就是一个进程 一个进程可以创建多个线程 现在系统中 系统调度的最小单元是线程 2.多线程有什么用? 发挥多核CPU的优势 如果使用多线程 将计算 ...
- Java多线程学习笔记(一)——多线程实现和安全问题
1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...
- java 多线程学习笔记
这篇文章主要是个人的学习笔记,是以例子来驱动的,加深自己对多线程的理解. 一:实现多线程的两种方法 1.继承Thread class MyThread1 extends Thread{ public ...
- Java多线程学习笔记--生产消费者模式
实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
- Java多线程学习笔记
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...
- C# 多线程学习笔记 - 3
本文主要针对 GKarch 相关文章留作笔记,仅在原文基础上记录了自己的理解与摘抄部分片段. 遵循原作者的 CC 3.0 协议. 如果想要了解更加详细的文章信息内容,请访问下列地址进行学习. 原文章地 ...
随机推荐
- [Linux]gocron定时任务平台的部署
采用二进制文件的方式部署非常简单,因为go已经把源码打包成了可执行文件,下载下来直接运行就可以了,不需要自己去编译和配置依赖 下载执行文件的地址是:https://github.com/ouqiang ...
- luoguP1447 [NOI2010]能量采集
https://www.luogu.org/record/22874213 题目大意:给定n和m,求Σ(1<=i<=n)Σ(1<=j<=m)GCD(i,j)* 2-1 i和j的 ...
- c# WF 第11节 RichTextBox
本节内容: 1:RichTextBox的简介: 2:实例 1:RichTextBox的简介: 2:实例 实现实例: 1个RichTextBox 2个label 9 个button 步骤一: 步骤2 ...
- Tensorflow之变量赋值输出1+2+3+4+5+6+7+8+...
一.导入tensorflow import tensorflow as tf 二.定义计算图 (1)常量初始化 constant_name = tf.constant(value) (2)变量初始化 ...
- JDOJ3007 铺地板I
JDOJ3007 铺地板I https://neooj.com/oldoj/problem.php?id=3007 题目描述 有一个大小是 2 x N(1 <= N <= 105)的网格, ...
- 第一次作业--Numpy练习
1.创建一个边界值为1而内部都是0的数组,图例如下:[提示:]解此题可以先把所有值都设置为1,这是大正方形:其次,把边界除外小正方形全部设置为0.本题用到numpy的切片原理.多维数组同样遵循x[st ...
- android shape图形优化Button效果
android shape可以让我们通过定义xml文件的方式创建图形,当然只能实现一些比较简单的图形(圆形,矩形,椭圆,线段),但是已经相当不错了,通过shape创建的图形作为控件的背景已经基本可以满 ...
- Java 并发系列之十一:并发线程带来的风险
1. 概述 在并发中有两种方式,一是多进程,二是多线程,但是线程相比进程花销更小且能共享资源. 线程带来的风险: 1. 安全性问题.错误的问题永不发生.竞态条件(顺序敏感). 2. 活跃性问题.正确的 ...
- 下载代码的时候 SSH与http的区别
SSH: git@gitlab.alibaba-inc.com:damai-mz/mz-market.git HTTP:http://gitlab.alibaba-inc.com/damai-mz/m ...
- antd模块组件文档思维导图整理