同步,异步,多线程,你怎么看?
讲解同步与异步的帖子多如牛毛,个人的理解,简单地说同步就是串行,异步就是并行。同步的情况下,A调用B,A等B执行完成后接着执行,自始至终只有一个线程在运行;而异步时,A调用B,B执行,A也继续执行,这个过程中有两个线程在运行。本文通过winform下的一个实例讲解同步与异步的差别,本文的例子很简单,适合初学者。
1.同步
大家应该经常碰到这种情况,点击界面上某个按钮或者某个控件后界面卡死的情况,个人觉得其中一个原因可能是主线程的问题,界面主线程在后台处理其他任务,没法同时响应用户的操作。看一个最简单的例子,界面如下:
代码:
private void btnCalc_Click(object sender, EventArgs e)
{
int sum = Calc(100);
rtxtMain.Text = "calc over, result is " + sum;
MessageBox.Show("计算完成", "提示");
}
private int Calc(int n)
{
int sum = 0;
Thread.Sleep(TimeSpan.FromSeconds(20));
for (int i = 0; i < n; i++)
{
sum += i;
}
return sum;
}
很明显,使用这种方法时点击按钮后界面就卡住,直到后台方法执行完才响应。原因是只有主线程在运行,那么咱们再重新起一个新线程,可以自己另起一个线程,或者使用.NET提供的异步方法。
2.异步
.NET异步时重新从线程池中启动了一个线程,本例中这个线程负责执行后台的方法,界面主线程继续响应用户的操作。线程池线程执行完后台方法后弹出提示框提示主线程工作已做完。代码如下:
public delegate int CalcEventHandler(int n); //定义委托
public partial class MainFrm : Form
{
public MainFrm()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false; //禁用非法跨线程调用检查
}
private void btnCalc_Click(object sender, EventArgs e)
{
CalcEventHandler mycalc = new CalcEventHandler(Calc);
AsyncCallback async = new AsyncCallback(OnComplete); //回调方法
mycalc.BeginInvoke(100, async, "this is your data" ); //执行异步
}
private int Calc(int n)
{
int sum = 0;
Thread.Sleep(TimeSpan.FromSeconds(20));
for (int i = 0; i < n; i++)
{
sum += i;
}
return sum;
}
//异步完成后执行的回调方法
private void OnComplete(IAsyncResult asycResult)
{
AsyncResult result = (AsyncResult)asycResult;
CalcEventHandler del = (CalcEventHandler)result.AsyncDelegate; //向下转换
int sum = del.EndInvoke(asycResult); //获取返回值
string data = result.AsyncState != null ? result.AsyncState.ToString() : string.Empty; //获取传递的数据
rtxtMain.Text = "calc over, 结果为 " + sum + ", 传递信息为 " + data;
MessageBox.Show("计算完成","提示"); //提示主线程
}
}
结果如下:
这样,界面不会出现卡死的情况,可以提高用户体验。当然这只是一个简单的例子。
还有一种方法就是,自己另外启一个线程,代码如下:
private void btnCalc_Click(object sender, EventArgs e)
{
Thread tr = new Thread(new ThreadStart(Calc)); //启动新线程
tr.Start();
}
private void Calc() //重载方法
{
Calc(100);
}
private int Calc(int n)
{
int sum = 0;
Thread.Sleep(TimeSpan.FromSeconds(5));
for (int i = 0; i < n; i++)
{
sum += i;
}
rtxtMain.Text = "calc over, 结果为 " + sum; //提示移到这里
MessageBox.Show("计算完成", "提示");
return sum;
}
小结:
1.这个例子很简单,用于了解同步和异步的区别和作用。
2.同步和异步跟为委托和多线程是相关联的,有兴趣的朋友继续学习委托和多线程相关知识。
本文写的很简单,谢谢你的阅读,如果有好的建议或方法,欢迎留言,一起交流~~
转载于:https://www.cnblogs.com/lonelyxmas/p/3600676.html
同步,异步,多线程,你怎么看?相关推荐
- 同步异步多线程这三者关系,你能给面试官一个满意的回答吗?
前几天一位朋友去面试,面试官问了他同步,异步,多线程之间是什么关系,异步比同步高效在哪?多线程比单线程高效在哪?由于回答的不好,让我帮他捋一下,其实回答这个问题不难,难就难在只对别人说理论,而没有现杀 ...
- 那些年搞不懂的多线程、同步异步及阻塞和非阻塞(二)---概念区分
概念解释: 同步/异步, 它们是消息的通知机制 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 简单来说就是当前程序执行完才能执行后面的程序,程序执行时按照顺序执行, ...
- 同步异步单线程多线程初级理解
对于我开始接触同步异步单线程多线程的概念的时候,都是分别理解同步和异步.单线程和多线程概念,当看到"使用同步方法保证线程安全"时愚昧的理解为那就是单线程咯:于是就陷入了困惑,同步等 ...
- 一则故事表达:并发,并行,同步,异步,线程,多线程
一个小事件说明下并发,并行,同步,异步,线程,多线程 一个广交会举办向8间公司发起展览邀请, 参展公司有8间,场地有80万平方米的展示区域, 每个参展商有10万平方米可以用于展出售卖, 每个参展公司仅 ...
- 同步与异步多线程的区别
先需要讲解一下计算机的基本概念: 进程:一个程序在操作系统上运行时,占用操作系统的资源,起名叫进程. 线程:线程是程序执行的最小单位,进程在执行任何一个操作或者响应,都是由线程完成的,执行过程中,使用 ...
- 进程线程、同步异步、阻塞非阻塞、并发并行、多线程
一: 进程和线程 1: 进程(Process) 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程.线 ...
- C#.net同步异步SOCKET通讯和多线程总结(转)
C#.net同步异步SOCKET通讯和多线程总结 来源:http://www.cnblogs.com/Silverlight_Team/archive/2009/03/13/1411136.html ...
- iOS 多线程的简单理解(1) 方式 :同步 异步
最近遇到特别糟糕的面试,过程中提到多次对多线程的处理问题,并没有很好的给予答复和解决,所以在这里做个简单的备案: 期望能更加了解和熟练使用 多线程技术: 下面都是自己的总结,如果存在不对的,或者不足, ...
- 过程 线 多线程 并发 同步异步
过程 线 多线程 并发 同步异步 好多人的过程,线,多线程,并发,同步,异步概念混淆,这不是一个好大学讲学的缘故啊.在这里,我们感受到的概念,帮助学生感受审查困惑. 计划 用来描述个别功能程序中描述的 ...
- java 高效的多线程同步_java多线程的同步和异步
java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...
最新文章
- python实现scp功能_转python实现ftp,scp的实现
- python语言:烟花效果实现
- 【MM模块】Procurement for Stock Material 库存型物料采购相关
- 智能型住宅自动控制与管理系统分析
- php 身份认证服务,PHP的HTTP身份认证
- POJ-3624 Charm Bracelet dp
- laragon环境更新安装新的php版本操作方法
- java5.0下载_java虚拟机
- 物联网通信之Coap 协议
- 【教程】2分钟搭建Jetbrains系列的Linux授权服务器
- 12306一直提示网络有问题_春运10日拉开大幕 买票遇到问题?别慌!这里有答案...
- 关于Ajax回调函数返回值判断的问题
- Python学习笔记-系统性能信息模块psutil
- 【Cilium 1.10 重磅发布!】支持 Wireguard, BGP, Egress IP 网关, XDP 负载均衡, 阿里云集成
- Node.js+Vue.js全栈开发王者荣耀手机端官网和管理后台(一)
- 全网最全的 Notion 类软件盘点
- JAVA调用有道API接口对数据库中的中文语句进行翻译
- 什么是WiFi 6?
- python爬取笔趣阁小说的代码微小调整修改
- Samba实现Linux与windows文件共享
热门文章
- 订单管理系统(含源码)
- 使用贝赛尔路径(UIBezierPath)创建画板
- posix thread线程
- 在Win7虚拟机下搭建Hadoop2.6.0伪分布式环境
- Quartus II常见问题集锦
- Oracle数据库php短连接,PHP 连接 Oracle
- mysql 第几周 时间戳_php时间戳函数实现计算第几周,以及当天所在周的具体日期范围...
- 微信支付宝扫一扫进入小程序的相关配置
- Android应用安装apk版本升级,适配Android 8.0和Android 10.0下载安装,shell命令安装APK
- [JVM]35个java代码性能优化总结