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

}

}

时间: 2024-09-12 21:01:26

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**************&

使用委托实现同步回调与异步回调

使用委托可以执行的一项有用操作是实现回调.回调是传入函数的方法,在函数结束执行时调用该方法. 例如,有一个执行一系列数学操作的函数.在调用该函数时,也向其传递一个回调方法,从而在函数完成其计算工作时,调用回调方法,向用户通知计算结果.   同步回调    首先声明两个方法: AddTwoNumbers():接受两个整型实参以及一个类型委托 ResultCallback():接受一个字符串,并显示出来.代码如下: using System; using System.Collections.Gen

C#:Func的同步、异步调用

实际开发中,对于一些耗时较长的操作,我们往往会将其封装成异步方式调用,以加速系统响应或改善用户体验,下面是一个示例: 有一个现成的类MyMath,里面有一个Add方法:  1 public class MyMath 2 { 3 4 public int Add(int a, int b) 5 { 6 System.Threading.Thread.Sleep(5000); 7 return a + b; 8 } 9 10 } 对Add方法做下封装,对了对比,同时提供"同步调用"与&qu

asp.net C# 异步调用的处理方法

A.   用回调函数(本例中为CallBackMethod),异步结束后,自动调用此回调函数.    B.   而不在主线程中手工等待异步结束,如上两例中在主线程中调用EndInvoke.此种方法,是在回调函数中调用EndInvoke的.      异步回调的大概流程是这样的:首先启动异步,启动参数加上异步结束时执行的方法,然后这个异步线程就不用管了,最后当这个异步线程自己完成工作了,就自动执行启动参数里的那个方法,这样确实很省心,可是代码写起来,就很复杂了. 一个最简单的异步调用  代码如下

.Net组件程序设计之异步调用

说到异步调用,在脑海中首先想到就是BeginInvoke(),在一些常用对象中我们也会常常见到Invoke()和 BeginInvoke(), 要想让自己的组件可以被客户端调用或者是异步调用,这样的设计是合理的,这也是组件异步机制当中的一条 (说句题外话--其实大多数知识都隐藏在我们平时经常见到的对象或者是代码里,只不过是没有去细心的发现) 在.NET中首先就会想到使用委托来进行异步调用,关于委托的定义在 委托与事件一文中已经大概的说过了,文中只是对委托进行了 大概的讲解,并没有对委托的使用来说

VB.NET中使用代表对方法异步调用

异步 按照我们常规的思维方式,计算机应该是干完一件事,然后再干下一件.用术语来说,这种执行任务的方式叫做同步执行(Synchronous Execution).既然这样,那么为什么要引入异步执行的概念呢? 目录 为什么要使用异步调用实现异步调用的步骤和机理 为什么要使用异步调用(Asynchronous Method Execution) 按照我们常规的思维方式,计算机应该是干完一件事,然后再干下一件.用术语来说,这种执行任务的方式叫做同步执行(Synchronous Execution).既然

remote script文档(转载自微软)<六>异步调用 Remote Scripti

文档: 调用 Remote Scripting 方法异步Remote scripting 向您提供了异步调用服务器方法的选择 ──当执行服务器方法时,用户的客户脚本继续运行.异步调用 remote scripting 方法使得您可以避免应用程序用户接口速度的减慢,因为您可以在执行服务器脚本的同时继续工作.注意 如果您的应用程序需要,那么也可以同步调用服务器方法.有关详细信息,请参阅同步调用 Remote Scripting 方法.异步调用某个 remote script 类似于同步调用.不过,当

Java多线程实现异步调用的方法_java

在JAVA平台,实现异步调用的角色有如下三个角色:调用者 提货单   真实数据 一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单.然后在过一断时间后凭提货单来获取真正的数据. 去蛋糕店买蛋糕,不需要等蛋糕做出来(假设现做要很长时间),只需要领个提货单就可以了(去干别的事情),等到蛋糕做好了,再拿提货单取蛋糕就可以了. public class Main { public static void main(String[] args) { System.out.println("ma

c#使用委托实现异步调用

异步 异步编程是受公共语言运行库的许多领域(如远程处理.ASP.NET 和 Windows 窗体)支持的功能.异步编程是 .NET Framework 中的核心概念.使用 .NET 异步编程,在程序继续执行的同时对 .NET 类方法进行调用,直到进行指定的回调为止:或者如果没有提供回调,则直到对调用的阻塞.轮询或等待完成为止. 异步编程是由 .NET Framework 的许多区域支持的功能,这些区域包括: 文件 IO.流 IO.套接字 IO 网络:HTTP.TCP 远程处理信道(HTTP.TC