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

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

一、同步执行

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

  下面是同步执行的流程图

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

        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. URL 截取参数 正则

    用处很多,记录下. function getvl(name) { var reg = new RegExp("(^|\\?|&)"+ name +"=([^&am ...

  2. CSS入门学习

    一.What? CSS的全称是CascadingStyle Sheet,汉语意思是"级联样式表".通常又称为"风格样式表(StyleSheet)".它是用来进行 ...

  3. C语言预处理条件语句的 与或运算

    1.#ifdef 与或运算 #ifdef  (MIN)  && (MAX)  ----------------------------错误使用 #if  defined(MIN)  & ...

  4. HashSet、LinkHashSet、TreeSet总结

    HashSet:散列集,集合中的元素不允许重复,但是不要求顺序,输出的顺序和进入HashSet的顺序是没有关系的 LinkedHashSet :链表散列集,集合中的元素不允许重复,同时要求和进入Set ...

  5. Android: 亲測解决模拟器启动慢的问题

    1.首先在相应的sdk manager里面下载一个4.03以上的api. 这里我选择的是4.2.2 (api17) 2.选择里面的" Intel Hardware Accelerated E ...

  6. [省选]板块(shenben已经AFO!!!)

    shenben已经AFO!!! 部分摘抄自网络 同样的,加粗是重点,星号是选学 图论 网络流(dinic,ISAP选一个,费用流写EK就行.*zkw费用流),二分图 点分治,边分治,*动态点分治 树链 ...

  7. 基于EasyDarwin实现幼儿园监控类项目

    移动互联网越来越普及,幼儿园监控类的项目也越来越多,如何能够以最低的成本.最快的速度搭建一套幼儿园监控类的平台成了许多开发者的需求,那么我们今天就来简单探讨一下如何基于EasyDarwin实现一套幼儿 ...

  8. pexpect库学习之包装类详解

    在pexpect库中,包装类的构造参数使用的命令或者要包装命令的提示符,还可以通过这个包装类来修改命令的提示符,那么所谓的包装类实际就是用于给用户交互相应的子命令,它的实例方法主要是“run_comm ...

  9. Kafka理论学习

    Kafka Consumer设计解析 http://www.jasongj.com/2015/08/09/KafkaColumn4/

  10. java之EJB

    EjB,只是一个服务端运行组件,公开接口供客户端以C/S方式调用而已. 最直白,最本质的解释,可参见: http://blog.csdn.net/jojo52013145/article/detail ...