知识大全 C#委托的同步调用和异步调用

Posted

篇首语:秤砣虽小,能压千斤。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#委托的同步调用和异步调用相关的知识,希望对你有一定的参考价值。

C#委托的同步调用和异步调用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  对于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( );

  Console WriteLine( Do other work );

  Console WriteLine(result);    Console ReadLine();

  

  static int Add(int a int b)

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

  Thread Sleep( );

  Console WriteLine( Computing Complete );

  return a+b;

  

  

  运行结果

  **********SyncInvokeTest**************  Computing +   Computing Complete   Do other work   同步调用会阻塞线程 如果是要调用一项繁重的工作(如大量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( 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( );

  Console WriteLine( Computing Complete );

  return a+b;

  

  

  运行结果

  **********AsyncInvokeTest**************  Do other work   Computing +   Computing Complete  

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

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

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

  回调异步

  public class Foo

  

  static void Main()

  Console WriteLine( **********AsyncInvokeTest************** );

  AddHandler handler = new AddHandler(Add);

  IAsyncResult result = handler BeginInvoke( 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( );

  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);

  

cha138/Article/program/ASP/201311/21819

相关参考

知识大全 关于webservice的异步调用实例

  关于webservice的异步调用简单实例无论在任何情况下被调用方的代码无论是被异步调用还是同步调用的情况下被调用方的代码都是一样的  下面我们就以异步调用一个webservice为例作说明这是一

知识大全 C#使用委托调用实现用户端等待闪屏

C#使用委托调用实现用户端等待闪屏  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb

知识大全 结合Spring2.0和ActiveMQ进行异步消息调用

结合Spring2.0和ActiveMQ进行异步消息调用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Java多线程实现异步调用

Java多线程实现异步调用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在JAVA平台实现异步

知识大全 Ajax基石脚本异步并发调用参数传递

Ajax基石脚本异步并发调用参数传递  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在Ajax开发框

知识大全 如何让Ext的RowExpander实现异步调用

如何让Ext的RowExpander实现异步调用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 实现异步调用Web Service,防止页面超时

实现异步调用WebService,防止页面超时  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  普

知识大全 Java WS和C#调用

JavaWS和C#调用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  互操作性是WebServi

知识大全 C#传值调用与引用调用

C#传值调用与引用调用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  usingSystem; 

知识大全 Javascript和C#之间的互相调用和访问

Javascript和C#之间的互相调用和访问  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这