1.声明方法

2.声明委托类型

3.创建委托对象

4.启动线程

5.在线程调用的方法里通过Control的Invoke方法执行委托

public Form1()

{

InitializeComponent();

//TextBox.CheckForIllegalCrossThreadCalls = false;//线程访问控件(不安全的方式)

dgShowMsgInTextBox = new DGShowMsgInTextBox(DoShowMsgInTextBox);

}

private void btnCount_Click(object sender, EventArgs e)

{

Count();

}

private void Count()//用UI计数(不另外开启线程)

{

DateTime beginTime = DateTime.Now;

for (int i = 0; i < 999999999; i++) { }

System.Threading.Thread.Sleep(3000);

DateTime endTime = DateTime.Now;

TimeSpan ts = endTime.Subtract(beginTime);

MessageBox.Show("计算完毕,总耗时:" + ts.TotalMilliseconds.ToString());

}

private void btnCountByThread_Click(object sender, EventArgs e)//用线程计数

{

//创建线程对象(传入委托对象),也可以直接传方法

Thread thread = new Thread(Count);

thread.Name = "t1";

//将线程标记为可以开始了

thread.Start();

}

private void button1_Click(object sender, EventArgs e)//不安全的访问控件

{

Thread threa = new Thread(CountAndShow);

threa.Start();

}

private void CountAndShow()//不安全的方式访问控件-需要设置TextBox.CheckForIllegalCrossThreadCalls = false

{

DateTime beginTime = DateTime.Now;

for (int i = 0; i < 10000000; i++)

{

txtNum.Text = i.ToString();

}

DateTime endTime = DateTime.Now;

TimeSpan ts = endTime.Subtract(beginTime);

MessageBox.Show("计算完毕,总耗时:" + ts.TotalMilliseconds.ToString());

}

private void CountAndShowSafety()//安全的访问UI线程上的控件

{

DateTime beginTime = DateTime.Now;//记录开始时间

for (int i = 0; i < 10000000; i++)

{

//调用Control类的Invoke方法 执行委托里的 方法

this.Invoke(dgShowMsgInTextBox, i.ToString());

}

DateTime endTime = DateTime.Now;//记录结束时间

TimeSpan ts = endTime.Subtract(beginTime);//计算时间差

MessageBox.Show("计算完毕,总耗时:" + ts.TotalMilliseconds.ToString());

//Random r = new Random();

//r.Next(10)

}

private void button2_Click(object sender, EventArgs e)//安全的访问控件 需要使用委托,并最终通过Control的Invoke方法执行

{

Thread tread = new Thread(CountAndShowSafety);

tread.Start();

}

delegate void DGShowMsgInTextBox(string msg);//安全访问控件的代码 声明一个委托类型

DGShowMsgInTextBox dgShowMsgInTextBox = null;//声明该委托的一个对象(在窗体的构造函数中实例化的),在线程执行代码中要访问控件时通过Invoke方法调用

void DoShowMsgInTextBox(string msg)

{

txtNum.Text = msg;

}

php线程安全和非线程安全_安全调用线程的步骤相关推荐

  1. Java线程池状态判断源码_深入浅出Java线程池:源码篇

    前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用.(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适).本文则深入线程池的源码,主要是介绍Thr ...

  2. python线程协程进程的区别_进程和线程、协程的区别

    现在多进程多线程已经是老生常谈了,协程也在最近几年流行起来.python中有协程库gevent,py web框架tornado中也用了gevent封装好的协程.本文主要介绍进程.线程和协程三者之间的区 ...

  3. hashmap是线程安全的吗?怎么解决?_解决SimpleDateFormat线程安全问题

    SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须通过加锁等方式保证线程安全. 例如下面一段代码,启动10个线程,同时使用一个`Simple ...

  4. python 线程通信的几种方式_进程间通信和线程间通信的几种方式

    进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代 ...

  5. 为什么线程池里的方法会执行两次_别以为线程池很简单,来回答下这些问题!...

    前言 线程池可以说是 Java 进阶必备的知识点了,也是面试中必备的考点,可能不少人看了这篇文章后能对线程池工作原理说上一二,但这还远远不够,如果碰到比较有经验的面试官再继续追问,很可能会被吊打,考虑 ...

  6. PHP - 版本选择 - 线程安全与非线程安全 - 学习/实践

    1.应用场景 主要用于弄清楚为什么会有线程安全与非线程安全的不同语言版本,以及这种情况是不是一直存在, 是否有解决统一的办法吗- 2.学习/操作 1.文档阅读 PHP For Windows: Bin ...

  7. 应用退出前不让线程切换_用户级线程和内核级线程,你分清楚了吗?

    前天晚上有个伙伴私信我说在学进程和线程,问我有没有好的方法和学习教程,刚好我最近也在备相关的课. 班上不少学生学的还是很不错的.拿班上小白和小明的例子吧(艺名哈).小明接受能力很强,小白则稍差些. 关 ...

  8. 阻塞io阻塞io_Redis:RESP协议,阻塞IO 与非阻塞IO,Redis的线程模型

    1.Redis 阻塞IO 与非阻塞IO Java在JDK1.4 中引入了NIO ,但是也有很多人在使用阻塞IO,这两种IO有什么区别? 在阻塞模式下,如果你从数据流读取不到指定大小的数据量,IO就会阻 ...

  9. 异步同步、阻塞非阻塞、异步回调、线程队列和协程

    今天学习了异步同步.阻塞非阻塞.异步回调.线程队列和协程 一.异步同步和阻塞非阻塞 线程的三种状态: 1.就绪 2.运行 3.阻塞 阻塞:遇到了IO操作  代码卡住  无法执行下一行  CPU会切换到 ...

最新文章

  1. T-SQL查询进阶--基于列的逻辑表达式
  2. css 加随机数 引用_在CSS中生成随机数
  3. OpenCV的轮廓查找和填充
  4. mysql有类似dbms_output.pu_line();_使用MySQL,SQL_MODE有哪些坑,你知道么?
  5. [转]Socket的阻塞模式和非阻塞模式
  6. 权限操作-springSecurity快速入门-使用自定义页面
  7. 计算一个数的二进制中1的个数
  8. Enterprise search - Build Search dropdown list - cache issue
  9. [读书笔记] 设计模式与游戏完美开发
  10. CODEVS 3269 混合背包
  11. 切图后用ie6浏览时切片间有空隙
  12. 人到中年,别再挥霍你的“同情心”了
  13. rgb颜色查询工具_《我的眼睛–图灵识别》第三章:基础:颜色识别
  14. 3升5升得4升——倒水问题的万能解法(扩展欧几里得算法)
  15. Berland and the Shortest Paths CodeForces - 1005F(最短路树)
  16. Android系统是目前最为流行的手机系统之一
  17. 解决:System.Data.SqlClient.SqlException: 超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)....
  18. python调用通达信公式_通达信公式-主力雷达Python化
  19. 非同质化代币(NFT)概述
  20. 北京君正案例:超能面板PRO采用4英寸IPS超清多彩屏,值不值得买?

热门文章

  1. 王道机试指南读后总结-3
  2. java jni编译_从源码编译Android系统的Java类库和JNI动态库的方法
  3. jdbc数据库配置mysql数据库_JDBC连接MySQL数据库(一)——数据库的基本连接
  4. 游戏王计算机兽,游戏王星杯卡——迅猛龙,再生圣经,入侵蠕虫,鼹鼠,幽世之血樱...
  5. python如何输入多行数据合并_关于Python中的合并字典,这些问题必须搞清楚!
  6. 跨境电商是什么?跨境电商有哪些模式?
  7. 独立站运营模式怎么选择?
  8. java filechannel 性能_FileChannel 和 MappedByteBuffer 实现上有什么不同?为什么性能差这么多?...
  9. 树和森林与二叉树的转换、树和森林的遍历
  10. Leetcode每日一题:44.wildcard-matching(通配符匹配)