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

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

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

 

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

 

 

 

 

 

时间: 2024-11-08 21:15:20

同步,异步,多线程,你怎么看?的相关文章

Windows I/O模型、同步/异步、阻塞/非阻塞

同步 异步 异步的概念和同步相对.当一个异步过程调用发出后,调用者不能立刻得到结果.实际处理这个调用的部件在完成后,通过状态.通知和回调来通知调用者.以 CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用 Connect函数发出一个连接请求后,调用者线程立刻可以朝下运行.当连接真正建立起来以后,socket底层会发送一个消息通知该对象.这里提到执行 部件和调用者通过三种途径返回结果:状态.通知和回调.可以使用哪

同步/异步 阻塞/非阻塞 .

http://blog.csdn.net/lb85858585/article/details/6693458  同步/异步与阻塞/非阻塞的区别 我喜欢用自己的语言通过联系现实生活中的一些现象解释一些概念,当我能做到这一点时,说明我已经理解了这个概念.今天要解释的概念是:同步/异步与阻塞/非阻塞的区别. 这两组概念常常让人迷惑,因为它们都是涉及到IO处理,同时又有着一些相类似的地方. 首先来解释同步和异步的概念,这两个概念与消息的通知机制有关. 举个例子,比如我去银行办理业务,可能选择排队等候,

[转]举例说同步异步阻塞非阻塞机制

劫匪冲进某花园小别墅,端着AK47,向某衰男甩过去一个袋子:说,快,把现金拿出来给我放进去,这个时候劫匪一直跟着衰男去装钱,看钱装满了他就拿走,此时劫匪是阻塞 的,因为劫匪不能干其他的,得看着这个衰男,免得他搞鬼.    想象下,如果劫匪等衰男自己去装钱,在钱装满之前,他自己可以到处翻箱倒柜,找点值钱的首饰黄金之类的,那么这个时候劫匪就是非阻塞 的,因为劫匪并没有阻塞在衰男去装钱这个环节上,劫匪可以自由活动做点其他的小买卖.       再来回顾下上面的情节,如果劫匪在抢*劫时需要不时自己看看衰

UDP 接收数据同步 异步选择问题

问题描述 同步加线程使用事件并发处理接收到的数据publicvoidSyncRecive(){Tasklisten=newTask(()=>{while(true){intlength=connect.ReceiveFrom(this.packetBuffer,0,this.packetBuffer.Length,SocketFlags.None,refthis.remoteEndPoint);byte[]packet=this.packetBuffer.Unpack(length);if(le

浅谈java中异步多线程超时导致的服务异常_java

在项目中为了提高大并发量时的性能稳定性,经常会使用到线程池来做多线程异步操作,多线程有2种,一种是实现runnable接口,这种没有返回值,一种是实现Callable接口,这种有返回值. 当其中一个线程超时的时候,理论上应该不 影响其他线程的执行结果,但是在项目中出现的问题表明一个线程阻塞,其他线程返回的接口都为空.其实是个很简单的问题,但是由于第一次碰到,还是想了一些时间的.很简单,就是因为阻塞的那个线 程没有释放,并发量一大,线程池数量就满了,所以其他线程都处于等待状态. 附上一段自己写的调

求助:关于异步多线程Socket已连接的客户端IP地址和端口

问题描述 如题,网上找了1个异步多线程的C#代码.可以实现客户端连接后客户端发送的数据再发送回去.但是我不知道怎么能把连接到这个服务器的客户端的IP显示出来,断开时候也有个提示,此外,比如说这个客户端连接了4个客户端,我想对第2个客户端主动发送数据怎么弄?求助usingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading;//Stateobjectforreadingclient

php异步多线程swoole使用实例程序

Swoole 提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询. swoole以前听过, 拿来做游戏服务器简直是神器-今天稍微的感受了一下,  在 ubuntu 下搭建了环境, 测试了一下 测试代码:  代码如下 复制代码 <?php class page extends Controller {     function index()     {         $data

听说httpwebreqeust也有同步异步,那么跟线程的同异步有什么区别呢?

问题描述 听说httpwebreqeust也有同步异步,那么跟线程的同异步有什么区别呢? 解决方案 解决方案二:没有线程哪来的异步啊.就好象你用c#编程,别人问题"你用这个编程那么跟机器语言有什么关系啊?",你就可以回答"机器不执行机器语言,哪来的c#啊".解决方案三:这里的同步与线程同步不是一个概念.线程同步是指多个线程同时访问一个变量或对象的情景httpwebrequest的同步(即同步代码)与我们多数的编程情景是一样的,下一行执行的代码依赖前一句执行完成才能继

同步异步动态引入js文件的几种方法总结_javascript技巧

动态加载js文件 有时候我们需要根据参数不同来引入不同的js文件,用html直接写标签满足不了我们的需求,总结几种方法,以及同步异步加载的各种需求 一.直接加载 <div id="divId"></div> <script> 二.异步加载,并发执行,但引入js内容不能直接使用 //1.1 直接document.write document.write("<script src='test.js'><\/script>

同步异步复位的区别

同步异步复位知识 同步复位:跟时钟clk有关 异步复位:跟时钟clk无关.   什么时候用到同步,异步复位? 答:当clk不稳定时,应该用到异步复位:当clk稳定时,可以用到同步复位.   异步复位:(敏感信号列表中有negedge rst_n) always@(posedge clk or negedge rst_n)     if(!rst_n)         ......     else begin         ...... end   同步复位:  always@(posedge