C#中的异步

C#5.0版本发布有一个"主题那就是异步编程。

我们先创建一个windowForm窗体,实现下面效果,然后我们通过简单的案例对比同步和异步;

首先我们编写一个耗时方法:

  /// <summary>
         /// 耗时方法
         /// </summary>
         /// <param name="name"></param>
         private void DoSomething(string name)
         {
             Stopwatch watch = new Stopwatch();
             watch.Start();
             Console.WriteLine("这里是name={0},当前线程ID={1}",name,Thread.CurrentThread.ManagedThreadId);
             ;
             ;i<;i++)
             {
                 IResult += ;
             }
             Thread.Sleep();
             watch.Stop();
             Console.WriteLine("这里是name ={0},当前线程ID ={1},计算结果是{2},耗时{3}",name,Thread.CurrentThread.ManagedThreadId,IResult,watch.ElapsedMilliseconds);
         }

这个耗时方法就是为了执行耗费的时间可明显感知,

然后我们写一个同步方法,执行这个DoSomething()

  private void btnTongbu_Click(object sender, EventArgs e)
         {
             Console.WriteLine("*********************同步执行************************");
             ;i<;i++)
             {
                 string name = string.Format("同步_Click_{0}",i);
                 DoSomething(name);
             }
             Console.WriteLine("*********************同步结束************************");
             Console.WriteLine("\n\n");
         }

打印出来计算结果

我们可以从当前的线程ID看出他只有一个线程,并且是顺序执行

我们在写一个异步调用

 private void btnAsync_Click(object sender, EventArgs e)
         {
             Console.WriteLine("*********************异步执行************************");
             ; i < ; i++)
             {
                 string name = string.Format("同步_Click_{0}", i);
                 DoSomethingHandler method = DoSomething;
                 method.BeginInvoke(name, null, null);
             }
             Console.WriteLine("*********************异步结束************************");
             Console.WriteLine("\n\n");
         }

执行之后我们对比一下执行结果:

对比之后发现了什么?

首先他的执行和结束风格符在一块了,这是怎么回事呢,这个是因为异步执行的时候线程不同,执行的顺序发生了改变。他的name序号是无序的,线程id也不相同。我们在来看看同样执行的cpu占用率

这个是同步的CPU占用截图,会发现有小峰值,但是基本平稳。这个是异步的CPU占用的截图,出现了明显峰值。

BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,只不过还有两个额外的参数

原来我们是这样使用的 method.BeginInvoke(name, null, null);

我们来看看他的其他两个参数

  private void btnAsyncSr_Click(object sender, EventArgs e)
         {
             Console.WriteLine("*********************异步深入执行************************");
             );
             DoSomethingHandler method = DoSomething;

             AsyncCallback callback = t => Console.WriteLine("这里是AsyncCallback,当前线程ID={0},AsyncState={1}",Thread.CurrentThread.ManagedThreadId,t.AsyncState);
             method.BeginInvoke(name,callback,"设定状态1");
             //method.BeginInvoke(name, null, null);

             IAsyncResult reuslt=method.BeginInvoke(name,t=> Console.WriteLine("这里是IAsyncResult,当前线程ID={0},AsyncState={1}", Thread.CurrentThread.ManagedThreadId, t.AsyncState),"设定状态2");

             Console.WriteLine("*********************异步深入结束************************");
             Console.WriteLine("\n\n");
         }

IAsyncResult 接口存储一个异步操作的状态信息,并提供一个同步对象,以使线程能够在操作完成时发出信号。

AsyncCallback委托表示异步操作完成时调用的回调方法

我们在来看看异步等待

reuslt.AsyncWaitHandle.WaitOne(-1);//一直等待到结束

他是等待一个线程结束后在执行下一线程

while(!reuslt.IsCompleted)
{
Thread.Sleep(100);
Console.WriteLine("请继续等待……");
}

method.EndInvoke(reuslt);

这是三种异步等待的的方法和结果。我们来总结一下啊

/*
*总结
* 1、同步方法会卡住界面,异步方法不卡界面;原因:异步启动了子线程来执行任务,主线程得到释放
* 2、同步方法会慢,异步方法比同步快;原因:异步启动了多个线程执行任务,占用了更多资源
* 3、异步是无序的;原因:线程的启动和执行是有操作系统决定的,是无序的。
*/

最新文章

  1. Spring(Model)
  2. 再见,OI
  3. iOS开发UI篇—核心动画(关键帧动画)
  4. Shell脚本:使用rsync备份文件/目录
  5. JavaScript 垃圾回收机制分析
  6. hdu 5188
  7. 慕课linux学习笔记(四)常用命令(1)
  8. ps&amp;&amp;/proc/pid/xxx
  9. uva 10911 - Forming Quiz Teams(记忆化搜索)
  10. 原生js 遍历文件夹分析xml并保存
  11. springboot启动的时候日志缺少Mapping日志等
  12. IKE协议
  13. 6. 纯 CSS 绘制一颗闪闪发光的璀璨钻石
  14. 关于Cocos2d-x中数据的存储提取和类型转换
  15. vim如何粘贴
  16. NumPy Matplotlib库
  17. libnetwork 源码浅析
  18. Ubuntu下&amp;nbsp;Nfs服务器安装
  19. 116th LeetCode Weekly Contest Maximum Width Ramp
  20. python学习之对象的三大特性

热门文章

  1. Java基础(十一) Stream I/O and Files
  2. HDU_1698 Just a Hook(线段树+lazy标记)
  3. scrapy爬虫框架setting模块解析
  4. UI性能优化
  5. CSS3渐变相关
  6. APP之构架自己的webapi框架
  7. arcgis api for js之echarts开源js库实现地图统计图分析
  8. Func和Action委托简单用法
  9. ArcGIS API for JavaScript 4.2学习笔记[15] 弹窗内容的格式与自定义格式
  10. Java解析word,获取文档中图片位置