异步回调,什么是异步回调?我是这样理解的,当主线程在执行一段代码的时候,我们用委托执行了一个线程,这个线程要返回一个结果,关键是什么时候返回这个结果,异步回调就是在这个线程执行完成后立即返回这个线程的结果,然后继续执行主线程的方法。

在讨论异步回调之前我们先依次来讨论一下同步执行和异步执行,最后来讨论异步回调。

一、同步执行

同步执行:在主线程执行的时候,主线程调用一个其它方法,此时主线程阻塞,等待调用方法执行完成后主线程才能继续执行。

  下面是同步执行的流程图

  接下来看看代码中的同步执行

        static void Main(string[] args)
{
#region 同步执行
for (int i = 0; i < 100; i++)
{
if (i == 50)
{
Console.Write("调用方法TakeAWhile并等待方法执行完成。");
TakeAWhile(1, 3000);
Console.Write("方法TakeAWhile执行完成。。。");
}
Thread.Sleep(30);
Console.Write(".");
}
#endregion
}
static int TakeAWhile(int data, int ms)
{
Thread.Sleep(ms);
return ++data;
}

二、异步执行:

  异步执行:在主线程在执行的时候,打开一个子线程,主线程继续执行,当主线程需要子线程运行的结果的时候,主线程直接调用子线程运行结果,如果在调用的时候子线程还没有执行完成,主线程等待,直到子线程执行完成,主线程再继续执行。

  下面是异步执行的流程图

  接下来我们看看代码中的异步执行

        static void Main(string[] args)
{
#region 异步执行
Func<int, int, int> d2 = TakeAWhile;
IAsyncResult ar = d2.BeginInvoke(1, 3000, null, null);
while (!ar.IsCompleted)
{
Console.Write(".");
Thread.Sleep(50);
}
int result = d2.EndInvoke(ar);
Console.Write("result:{0}",result);
#endregion
}
static int TakeAWhile(int data, int ms)
{
Console.Write("TakesAWhile started");
Thread.Sleep(ms);
Console.WriteLine("TakeAWhile Completed");
return ++data;
}

三、异步回调

异步回调:主线程在执行的时候,打开一个子线程,主线程继续执行,当子线程执行完成的时候,主线程立即输出主线程的运行结果,主线程继续执行。

下面是异步回调执行的流程图

  接下来我们看看代码中的异步回调

  

static void Main(string[] args)
{
#region 异步回调
Func<int, int, int> dl = TakeAWhile;
dl.BeginInvoke(1, 3000, TakesAWhileCompleted, dl);
for (int i = 0; i < 100; i++)
{
Console.Write(".");
Thread.Sleep(50);
}
#endregion
}
static int TakeAWhile(int data, int ms)
{
Console.Write("TakesAWhile started");
Thread.Sleep(ms);
Console.WriteLine("TakeAWhile Completed");
return ++data;
}
static void TakesAWhileCompleted(IAsyncResult ar)
{
if (ar == null)
throw new ArgumentNullException("ar");
Func<int, int, int> dl = (Func<int, int, int>)ar.AsyncState;
int result = dl.EndInvoke(ar);
Console.WriteLine("Result:{0}",result);
}

C#基础:线程之异步回调(委托)的更多相关文章

  1. AsyncCallback 异步回调委托

    js是单线程语言,单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务.如果前一个任务耗时很长,后一个任务就不得不一直等着. 如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多 ...

  2. C# 多线程系列之异步回调(委托)

    本文参考自C#基础:线程之异步回调(委托),纯属读书笔记 在解析异步回调之前,先看同步回调的执行过程,以及代码原理. 1.线程的同步执行 同步执行:在主线程执行的时候,主线程调用一个其它方法,此时主线 ...

  3. C#(同步调用、异步调用、异步回调)

    Review: 原作者虽然使用了汉字的类名,看起来十分蹩脚,但是,还是把同步调用.异步调用.异步回调的使用讲解的很详细的.原理讲解的很清晰. ------ 本文将主要通过“同步调用”.“异步调用”.“ ...

  4. Future 异步回调 大起底之 Java Future 与 Guava Future

    目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...

  5. c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调

    单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都 ...

  6. C#基础:线程之异步委托

    线程:是程序中独立的指令流.在我们熟悉的Visual Studio编辑器中输入C# 代码的时候,系统会自动分析代码,提示你输入的代码出现的各种错误,这是一个后台线程完成的. 创建线程的一种简单的方式就 ...

  7. 委托(delegate)的三种调用方式:同步调用,异步调用,异步回调(转载)

    下面为即将被调用的方法: public delegate int AddHandler(int a,int b); public class 加法类 { public static int Add(i ...

  8. 协程 & 用户级(内核级)线程 & 切换开销 & 协程与异步回调的差异

    今天先是看到多线程级别的内容,然后又看到协程的内容. 基本的领会是,协程是对异步回调方式的一种变换,同样是在一个线程内,协程通过主动放弃时间片交由其他协程执行来协作,故名协程. 而协程很早就有了,那时 ...

  9. C# 委托的三种调用示例(同步调用 异步调用 异步回调)

    首先,通过代码定义一个委托和下面三个示例将要调用的方法: 复制代码 代码如下: public delegate int AddHandler(int a,int b);    public class ...

随机推荐

  1. Windows下利用CMake和VS2013编译OpenCV

    转载自:http://www.chengxulvtu.com/2014/03/19/windows_build-opencv-with-cmake-and-vs2013.html   获取OpenCV ...

  2. smartUpload注意过程

    操作的过程中一定要注意的几个方面:       1.将smartUpload.jar拷贝到tomcat/lib以及项目的lib下面,最好是只多不少!       2.因为上传的文件一般都很大,所以应该 ...

  3. ubuntu 安装后的配置

    osx 下用 vmware 安装了一个 ubuntu 虚拟机,版本是 14.04 server.安装完之后要做一系列配置,记录如下. 配置 Android 编译环境 sudo apt-get inst ...

  4. Andorid——ubuntu下的 NDK / JNI

    之前一直有接触源代码里面的JNI体系,知道个大概,仅仅管调进了哪个C/C++的接口,如今记录学习下. 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/ ...

  5. Ahead-of-time compilation

    https://en.wikipedia.org/wiki/Ahead-of-time_compilation

  6. 20170319 ABAP 生成XML文件

    方法一:ABAP 使用method方式操作XML 转自:http://www.cnblogs.com/jiangzhengjun/p/4265595.html 方法二:STRANS 转换工具;使用st ...

  7. 20170306 处理adobe flash player报错

    网页总是弹出Adobe Flash Player弹窗报错怎么办?打开网页时经常被Adobe Flash Player报错提示框困扰. 其实是因为系统安装了Debug版本的Flash Player,可是 ...

  8. Js中获取显示器、浏览器以及窗口等的宽度与高度的方法

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...

  9. jsp报An error has occurred. See error log for more details. Argument not valid错误

    An error has occurred. See error log for more details. Argument not valid 翻译过来是:一个错误已经发生.看到更多的细节错误日志 ...

  10. c/c++生成预编译文件

    Preprocesses C and C++ source files and writes the preprocessed output to a file.   /P Remarks The f ...