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

  讲解同步与异步的帖子多如牛毛,个人的理解,简单地说同步就是串行,异步就是并行。同步的情况下,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

同步,异步,多线程,你怎么看?相关推荐

  1. 同步异步多线程这三者关系,你能给面试官一个满意的回答吗?

    前几天一位朋友去面试,面试官问了他同步,异步,多线程之间是什么关系,异步比同步高效在哪?多线程比单线程高效在哪?由于回答的不好,让我帮他捋一下,其实回答这个问题不难,难就难在只对别人说理论,而没有现杀 ...

  2. 那些年搞不懂的多线程、同步异步及阻塞和非阻塞(二)---概念区分

    概念解释: 同步/异步, 它们是消息的通知机制 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 简单来说就是当前程序执行完才能执行后面的程序,程序执行时按照顺序执行, ...

  3. 同步异步单线程多线程初级理解

    对于我开始接触同步异步单线程多线程的概念的时候,都是分别理解同步和异步.单线程和多线程概念,当看到"使用同步方法保证线程安全"时愚昧的理解为那就是单线程咯:于是就陷入了困惑,同步等 ...

  4. 一则故事表达:并发,并行,同步,异步,线程,多线程

    一个小事件说明下并发,并行,同步,异步,线程,多线程 一个广交会举办向8间公司发起展览邀请, 参展公司有8间,场地有80万平方米的展示区域, 每个参展商有10万平方米可以用于展出售卖, 每个参展公司仅 ...

  5. 同步与异步多线程的区别

    先需要讲解一下计算机的基本概念: 进程:一个程序在操作系统上运行时,占用操作系统的资源,起名叫进程. 线程:线程是程序执行的最小单位,进程在执行任何一个操作或者响应,都是由线程完成的,执行过程中,使用 ...

  6. 进程线程、同步异步、阻塞非阻塞、并发并行、多线程

    一: 进程和线程 1: 进程(Process) 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程.线 ...

  7. C#.net同步异步SOCKET通讯和多线程总结(转)

    C#.net同步异步SOCKET通讯和多线程总结 来源:http://www.cnblogs.com/Silverlight_Team/archive/2009/03/13/1411136.html ...

  8. iOS 多线程的简单理解(1) 方式 :同步 异步

    最近遇到特别糟糕的面试,过程中提到多次对多线程的处理问题,并没有很好的给予答复和解决,所以在这里做个简单的备案: 期望能更加了解和熟练使用 多线程技术: 下面都是自己的总结,如果存在不对的,或者不足, ...

  9. 过程 线 多线程 并发 同步异步

    过程 线 多线程 并发 同步异步 好多人的过程,线,多线程,并发,同步,异步概念混淆,这不是一个好大学讲学的缘故啊.在这里,我们感受到的概念,帮助学生感受审查困惑. 计划 用来描述个别功能程序中描述的 ...

  10. java 高效的多线程同步_java多线程的同步和异步

    java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...

最新文章

  1. python实现scp功能_转python实现ftp,scp的实现
  2. python语言:烟花效果实现
  3. 【MM模块】Procurement for Stock Material 库存型物料采购相关
  4. 智能型住宅自动控制与管理系统分析
  5. php 身份认证服务,PHP的HTTP身份认证
  6. POJ-3624 Charm Bracelet dp
  7. laragon环境更新安装新的php版本操作方法
  8. java5.0下载_java虚拟机
  9. 物联网通信之Coap 协议
  10. 【教程】2分钟搭建Jetbrains系列的Linux授权服务器
  11. 12306一直提示网络有问题_春运10日拉开大幕 买票遇到问题?别慌!这里有答案...
  12. 关于Ajax回调函数返回值判断的问题
  13. Python学习笔记-系统性能信息模块psutil
  14. 【Cilium 1.10 重磅发布!】支持 Wireguard, BGP, Egress IP 网关, XDP 负载均衡, 阿里云集成
  15. Node.js+Vue.js全栈开发王者荣耀手机端官网和管理后台(一)
  16. 全网最全的 Notion 类软件盘点
  17. JAVA调用有道API接口对数据库中的中文语句进行翻译
  18. 什么是WiFi 6?
  19. python爬取笔趣阁小说的代码微小调整修改
  20. Samba实现Linux与windows文件共享

热门文章

  1. 订单管理系统(含源码)
  2. 使用贝赛尔路径(UIBezierPath)创建画板
  3. posix thread线程
  4. 在Win7虚拟机下搭建Hadoop2.6.0伪分布式环境
  5. Quartus II常见问题集锦
  6. Oracle数据库php短连接,PHP 连接 Oracle
  7. mysql 第几周 时间戳_php时间戳函数实现计算第几周,以及当天所在周的具体日期范围...
  8. 微信支付宝扫一扫进入小程序的相关配置
  9. Android应用安装apk版本升级,适配Android 8.0和Android 10.0下载安装,shell命令安装APK
  10. [JVM]35个java代码性能优化总结