第三媒体软件中心使用与技巧编程心得 → C#编程: 实例介绍 C#委托的同步调用和异步调用 TTL

C#编程: 实例介绍 C#委托的同步调用和异步调用

作者:第三媒体     来源:www.TheThirdMedia.com     日期:2010-07-01

[摘要]  
    对于C#委托我们谈的比较多,在此谈论的是C#委托中的同步调用和异步调用,希望本文的实例能给大家平时的工作有所帮助。
 
[正文]    
 对于C#委托我们谈的比较多,在此谈论的是C#委托中的同步调用和异步调用,希望本文的实例能给大家平时的工作有所帮助。

  C#委托的Invoke方法用来进行同步调用。同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。

  同步调用的例子:

  using System;

  using System.Threading;

  public delegate int AddHandler(int a, int b);

  public class Foo

  {

  static void Main()

  {

  Console.WriteLine("**********SyncInvokeTest**************");

  AddHandler handler = new AddHandler(Add);

  int result = handler.Invoke(1,2);

  Console.WriteLine("Do other work... ... ...");

  Console.WriteLine(result);    Console.ReadLine();

  }

  static int Add(int a, int b)

  {    Console.WriteLine("Computing "+a+" + "+b+" ...");

  Thread.Sleep(3000);

  Console.WriteLine("Computing Complete.");

  return a+b;

  }

  }

  运行结果:

  **********SyncInvokeTest**************  Computing 1 + 2 ...  Computing Complete.  Do other work... ... ...  3 同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了。异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。委托的异步调用通过BeginInvoke和EndInvoke来实现。

  异步调用:

  using System;

  using System.Threading;

  public delegate int AddHandler(int a, int b);

  public class Foo

  {

  static void Main()

  {

  Console.WriteLine("**********AsyncInvokeTest**************");

  AddHandler handler = new AddHandler(Add);

  IAsyncResult result = handler.BeginInvoke(1,2,null,null);

  Console.WriteLine("Do other work... ... ...");

  Console.WriteLine(handler.EndInvoke(result));

  Console.ReadLine();

  }

  static int Add(int a, int b)

  {

  Console.WriteLine("Computing "+a+" + "+b+" ...");

  Thread.Sleep(3000);

  Console.WriteLine("Computing Complete.");

  return a+b;

  }

  }

  运行结果:

  **********AsyncInvokeTest**************  Do other work... ... ...  Computing 1 + 2 ...  Computing Complete.  3

  可以看到,主线程并没有等待,而是直接向下运行了。

  但是问题依然存在,当主线程运行到EndInvoke时,如果这时调用没有结束(这种情况很可能出现),这时为了等待调用结果,线程依旧会被阻塞。

  解决的办法是用回调函数,当调用结束时会自动调用回调函数

  回调异步:

  public class Foo

  {

  static void Main() {

  Console.WriteLine("**********AsyncInvokeTest**************");

  AddHandler handler = new AddHandler(Add);

  IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(AddComplete),"AsycState:OK");

  Console.WriteLine("Do other work... ... ...");    Console.ReadLine();

  }

  static int Add(int a, int b)

  {

  Console.WriteLine("Computing "+a+" + "+b+" ...");

  Thread.Sleep(3000);

  Console.WriteLine("Computing Complete.");

  return a+b;

  }

  static void AddComplete(IAsyncResult result)

  {

  AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;

  Console.WriteLine(handler.EndInvoke(result));

  Console.WriteLine(result.AsyncState);

  }

  }


频道首页 】【 评论 】 【 打印 】 【 字体:
   上一篇:Oracle数据库: 分析如何得到Oracle跟踪文件的文件名
   下一篇:XY苹果助手: 购买Apple Watch,你必须得知道的事
导航:报价 | 大全 | 排行榜 | 产品大全 | 参量 | 订阅 
 Advertisement
 十大最受关注的新闻
1  XREAL One发布:搭载全球首颗专为空间显示定制的自研芯片
2  长语音、小作文、文字讨好症.Soul App 发布线上社交礼仪新规范
3  中小作者如何掘金?来抖音电商主播训练营加速成就好生意
4  蒙古民主党代表团阿兹扎亚(G.Azzaya)一行到访视源股份
5  首届“利伯兰杯”辩论赛下周开赛,新国辩冠军张子龙领衔出战
6  第十三届中国创新创业大赛创新挑战赛(西安)未来信息专场赛成功举办
7  心无畏,勇向前!2024电魂娱乐星赛季荣耀收官
8  致敬时代同行者,期待与你共绘新章!2024爱采购「岁末家年华」温情来袭
9  HTX亮相Bitcoin MENA:深化中东市场战略布局!
10  经营好工具 | 用「达人客服」高效沟通,好服务赢来更多好评
 十大热门驱动/软件下载
1  [手机驱动]手机usb万能
2  [热门常用软件]QQ2008正式版下载【腾讯QQ2008官方版Beta1】
3  [热门常用软件]E话通下载【E话通4.5 正式版】
4  [手机驱动]Samsung三星 手机USB驱动1.0版For Win98SE/ME/...
5  [手机驱动]Microsoft微软 ActiveSync同步软件4.5中文版Fo...
6  [摄像头驱动]万能摄像头 FOR Windows
7  [热门常用软件]皮皮播放器下载【PPFilm皮皮播放器 2.1.0....
8  [手机驱动]诺基亚 PC套件下载
9  [热门常用软件]面对面游戏下载【面对面视频游戏大厅】
10  [手机驱动]Microsoft微软 Windows Mobile Device Center ...
 十大最受关注的品牌
1  三星手机(SAMSUNG)
2  诺基亚手机(NOKIA)
3  华硕笔记本(ASUS)
4  摩托罗拉手机(MOTOROLA)
5  英特尔CPU(Intel)
6  华硕主板(ASUS)
7  LG手机(LG)
8  索爱手机(Sony Ericsson)
9  联想笔记本(lenovo)
10  宏碁笔记本(acer)
 十大热门常用软件下载
1  QQ2008正式版下载【腾讯QQ2008官方版Beta1】
2  E话通下载【E话通4.5 正式版】
3  皮皮播放器下载【PPFilm皮皮播放器 2.1.0.2版】
4  面对面游戏下载【面对面视频游戏大厅】
5  DVD解码器下载【NVIDIA DVD Decoder 1.02】
6  迅雷5下载【迅雷5.8.1.507官方版】
7  QQ2007 II正式版下载【腾讯QQ2007官方版本】
8  QQ2006正式版下载【腾讯QQ2006官方版本】
9  联众世界游戏大厅下载【联众世界2.7.0.8官方版】
10  MTV下载器【MTV下载精灵 8.31版】
11  pplive最新版下载【PPLive网络电视V1.9.35版】
12  迅雷(Thunder)下载【迅雷v5.7.12.493官方版】
13  腾讯QQ2008下载【腾讯QQ官方版2008极速贺岁版KB1】
14  Total Video Converter下载【Total Video Converter v3.1...
15  QQ拼音输入法下载【腾讯QQQQ拼音输入法V1.4.1版】
16  皮皮高清影视播放器下载【PIPIPlayer 2.7.0.3版】
17  eMule下载【电驴eMule官方v0.49a正式版】
18  极点五笔输入法下载【极点五笔6.1标准版】
19  QQ2009正式版下载【腾讯QQ2009 SP4官方版】
20  Vagaa哇嘎画时代版下载【哇嘎 2.6.5.10】
   >> 查看评论   
2楼     Re: C#编程: 实例介绍 C#委托的同步调用和异步调用
  555
  作者:hehe    2010-11-25 11:55:00
   
 
   >> 查看更多评论   [共有1条评论]
发表评论
        
        
   点评:
   姓名:  
            字数: 0
     
新闻精选
·解析「即创」优秀案例,探索AIGC创意素材新解
·2025社交趋势报告:电子布洛芬、情价比、最小
·2024年度360全国区域渠道案例大赛总决赛圆满
·百度安全双揽工信部典型案例,大模型安全技术
·发展新质生产力 赋能健康产品力 劲牌有限公司
·Arm 技术预测:2025 年及未来的技术趋势
  ·三星CES 2025大放异彩 全面展示无处不在的AI
·ChatBird开启AI陪伴新纪元,雷鸟加速AI技术落
·当你拥有一个智能家居生活的好“搭子”,是什
·胡家奇:第十一次致人类领袖的公开信
·预见2025:HTX的全球化蓝图与战略突破