同步,异步,多线程,你怎么看?

同步,异步,多线程,你怎么看?
原文:同步,异步,多线程,你怎么看?[原创]

  讲解同步与异步的帖子多如牛毛,个人的理解,简单地说同步就是串行,异步就是并行。同步的情况下,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.同步和异步跟为委托和多线程是相关联的,有兴趣的朋友继续学习委托和多线程相关知识。

 

本文写的很简单,谢谢你的阅读,如果有好的建议或方法,欢迎留言,一起交流~~

 

 

 

 

 

posted on 2014-03-14 15:27 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3600676.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openssl-1.0.0b - libssl 移植到ARM Linux

开发环境&#xff1a; ubuntu 10.04 arm-linux-gcc version 4.4.1 目标环境 友善之臂mini6410 linux-2.6.36 移植步骤 1&#xff0e;至官网下载最新的openssl&#xff0c;解压缩 2&#xff0e;cd进入openssl-1.0.0b目录 3&#xff0e;执行./Confiugre linux-elf-arm&#xff0c…

html仿qq最小化怎么实现,JS仿QQ好友列表展开、收缩功能(第一篇)

JS仿QQ好友列表展开、收缩功能(第一篇)发布时间&#xff1a;2020-10-17 14:20:03来源&#xff1a;脚本之家阅读&#xff1a;96作者&#xff1a;erdouzhang效果图如下所示&#xff1a;html:我的好友张三李四...企业好友小明小红...黑名单哈哈...css&#xff1a;ul,h3 {padding: …

Visual Studio 选择相同变量高亮

前段时间一直在使用matlab&#xff0c;今天需要使用vs2008&#xff0c;而用惯了matlab&#xff0c;习惯了其中一项选中变量高亮的设置&#xff0c;突然回来使用VS&#xff0c;感到各种不适应&#xff0c;顿时想到了一个词&#xff1a;矫情 呵呵&#xff0c;于是在网上找各种插件…

html是前段还是后端,javascript属于前端还是后端?

JavaScript是一种属于网络的脚本语言&#xff0c;已经被广泛用于Web应用开发&#xff0c;常用来为网页添加各式各样的动态功能&#xff0c;为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。前端开发和后端开发的区别在于&#xff1a…

Linux查看设置系统时区

关于时区的概念&#xff0c;其实初中地理课已经涉及&#xff0c;很多人都多少了解一些&#xff0c;可能只是细节搞不太清楚。为什么会将地球分为不同时区呢&#xff1f;因为地球总是自西向东自转&#xff0c;东边总比西边先看到太阳&#xff0c;东边的时间也总比西边的早。东边…

SQL基础问题整理

在程序中&#xff0c;数据库操作是必不可少的部分&#xff0c;所以我们要备足数据库相关知识才能去应付程序中出现的种种问题。基于此&#xff0c;我特地在国外网站、博客上整理了一些问题&#xff0c;并附带了答案和解释、参考。为了保证“原汁原味”&#xff0c;我就保留了英…

腾讯或联姻优酷,微信嫁女模式引发互联网通婚潮流

据消息称&#xff1a;腾讯在前段时间联姻京东后有可能继续做甩手掌柜&#xff0c;这回要甩的是腾讯视频。 前几年&#xff0c;最火爆的电商业务除了电商外&#xff0c;再者一个就是视频业务了。 不知道大家还记得优酷当时的崛起之初的情景么?我来罗列一下&#xff1a; 1、 大…

[翻译] 学习iOS开发的建议:如何从菜鸟到专家

[文章原地址] http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-from-novice-to-expert/ 翻译有误之处请勿见笑&#xff0c;本人将在文章的部分地方添加注释&#xff0c;并根据需求增减文章内容&#xff0c;在此对原作者辛勤劳作表示感谢 iOS Quick Tip: From Novi…

[nodejs]国内npm安装nodejs modules失败的几个解决方案

使用npm安装node模块时经常有卡住安装失败的情况&#xff0c;如图所示。原因在于npm服务器在美国&#xff0c;还有就是某强大的防火墙作用。这样的问题导致很多新手放弃使用node&#xff0c;几乎每天都有新手再问这个问题。现在分享一下解决这个问题的解决方案 1.可以通过一劳永…

java 合并单元格 把数据合并没了_合并单元格

合并单元格同样也是在表格中进行&#xff0c;关于合并单元格我们需要了解的两个概念&#xff1a;colspan 合并列&#xff0c;rowspan 合并行。colspan(跨列)合并列&#xff1a;colspan属性常用在 td 中&#xff0c;用来指定单元格横向跨越的列数。比如&#xff1a;将下面表格的…

一步步学习微软InfoPath2010和SP2010--第九章节--使用SharePoint用户配置文件Web service(2)--在事件注册表单上创建表单加载规则...

下面练习中&#xff0c;你将添加表单加载规则&#xff0c;将四个文本框域和图片控件与用户配置文件web service连接。当使用用户配置文件web service时&#xff0c;你需要将控件和来自web service合适的域绑定。这个过程需要用户配置文件架构的导航和筛选&#xff0c;来抽取合适…

光耦驱动单向可控硅_华越国际一文带路:可控硅触发设计技巧

序可控硅(Silicon Controlled Rectifier,简称SCR)&#xff0c;是可控硅整流元件的简称&#xff0c;是一种具有三个PN结的四层结构的大功率半导体器件&#xff0c;亦称为晶闸管。具有体积小、结构相对简单、功能强等特点&#xff0c;是比较常用的半导体器件之一。家用电器中的调…

Servlet JSP系列文章总结

前言 谢谢大家的捧场&#xff0c;真心感谢我的阅读者。 all 下一期&#xff0c;重点在 数据结构和算法 &#xff0c;希望给大家带来开心。已经出了几篇&#xff0c;大家爱读就是我的开心。 Servlet & JSP系列总结 博客&#xff0c;呵呵&#xff01;很开心&#xff0c;认识…

一般通话记录能保存多少条_鸡蛋放冰箱,能保存多少天?正确保存方法是什么?...

鸡蛋是我们经常吃的食物&#xff0c;很多家庭都会经常的买鸡蛋吃。相信大家买回来鸡蛋之后&#xff0c;普遍都是把鸡蛋放入冰箱里&#xff0c;什么时候想吃什么时候拿一个。但是大家可能不知道的是&#xff0c;鸡蛋就算是放在冰箱里保存&#xff0c;也是有保质期的&#xff0c;…

基本矩阵运算的Java实现

基本矩阵运算的Java实现 分类&#xff1a; 图像处理2012-09-18 10:36 2537人阅读 评论(3) 收藏 举报javamatrixparametersstringclassnull一&#xff1a; 矩阵的加法与减法 规则&#xff1a;矩阵的加法与减法要求两个矩阵的行列完全相等&#xff0c;方可以完成两个矩阵的之间的…

json返回页面读取data里的值都是object_【一】尤大神都说Vite香,让我来手把手分析Vite原理...

戳蓝字"前端优选"关注我们哦&#xff01;一.什么是Vite&#xff1f;法语Vite(轻量&#xff0c;轻快)vite 是一个基于 Vue3单文件组件的非打包开发服务器&#xff0c;它做到了本地快速开发启动、实现按需编译、不再等待整个应用编译完成的功能作用。对于Vite的描述&am…

e记法 python 底数_备战python二级

明天考试去&#xff0c;滚吧提醒与分值&#xff1a;1*40&#xff08;选择&#xff09;5*3&#xff08;填空&#xff09;101520比如今年的一个题目是要求随机抽一个手机品牌&#xff0c;这道题目的关键点在于你要使用seed()函数覆盖原来的给定的种子seed(1)&#xff0c;因为要求…

V210 UART TX 流程

1. 虽然V210的uart驱动是平台总线设备驱动模型&#xff0c;但实际上他还是以字符设备驱动存在&#xff0c;那么分析他的发送流程&#xff0c; 首先找到他的file_operations的write函数 drivers/char/tty_io.c tty_write(struct file *file, const char __user *buf, size_t cou…

浙江省计算机二级办公软件高级应用分值,浙江计算机二级高级办公软件word题分值是多少...

计算机文化基础试题集(浙江省计算机办公室软件等级考试悬赏分&#xff1a;10 - 离问题结束还有 12 天 23 小时一、选择题((1)&#xff5e;(30)每小题1分&#xff0c;(31)&#xff5e;(55)每小题2分&#xff0c;共80分)下列各题 A) 、B)、C)、D)四个选项中&#xff0c;只有一个选…

pppd 源码修改1

1. pppd拨号成功后&#xff0c;会将解析到的dns服务器IP地址&#xff0c;写入/etc/ppp/resolv.conf 这样的话&#xff0c;gethostbyname_r并不会识别&#xff0c;并且&#xff0c;如果有启动两路pppd的话&#xff0c;后面一路会将resolv.conf文件重写。 因此&#xff0c;这块代…