所谓同步:如果在代码中调用了一个方法,则必须等待该方法所有的代码执行完毕之后,才能回到原来的地方执行下一行代码。

异步:如果不等待调用的方法执行完,就执行下一行代码。

1.0 同步例子:

 class Program
{
private static int Calculate(int a, int b)
{
Console.WriteLine("1.开始计算!"); System.Threading.Thread.Sleep( * );//假如计算需要3秒钟 int c = a + b; Console.WriteLine("2.计算完成,结果:{0}+{1}={2}", a, b, c); return c;
} static void Main(string[] args)
{
Console.WriteLine("---------程序运行开始----------"); Calculate(, ); Console.WriteLine("---------程序运行结束----------"); Console.ReadKey();
}
}

1.1 运行结果:

2.0 改用异步调用

 static void Main(string[] args)
{
Console.WriteLine("-----------程序运行开始----------"); Func<int, int, int> action = Calculate;//声明一个委托 IAsyncResult ret = action.BeginInvoke(, , null, null); Console.WriteLine("1.我不参与计算,先走了啊!"); int amount = action.EndInvoke(ret); Console.WriteLine("-----------程序运行结束----------"); Console.ReadKey();
}

2.1 运行结果:

2.2 为了提高程序的使用体验,我们可以再计算的时候,每隔一秒钟,打印一个点“.”。整体代码改成如下:

 private static int Calculate(int a, int b)
{
System.Threading.Thread.Sleep( * );//假如计算需要3秒钟 int c = a + b; Console.WriteLine("\r\n计算完成,结果:{0}+{1}={2}", a, b, c); return c;
} static void Main(string[] args)
{
Console.WriteLine("-----------程序运行开始----------"); Func<int, int, int> action = Calculate;//声明一个委托 IAsyncResult ret = action.BeginInvoke(, , null, null); Console.WriteLine("我不参与计算,先走了啊!"); Console.WriteLine("正在努力计算:");
while (ret.IsCompleted == false)
{
Console.Write(".");
System.Threading.Thread.Sleep();
} int amount = action.EndInvoke(ret); Console.WriteLine("-----------程序运行结束----------"); Console.ReadKey();
}

2.3 运行结果:

 3.0 异步回调。以上方式还没有体现异步编程的效果,因为整个计算过程都是在“程序运行开始”和”程序运行结束“之间的。所以还有另外一种实现方式,整体代码改成如下:

 private static int Calculate(int a, int b)
{
System.Threading.Thread.Sleep( * );//假如计算需要3秒钟 int c = a + b; return c;
} static Func<int, int, int> func = Calculate;//声明一个委托 static void Main(string[] args)
{
Console.WriteLine("-----------程序运行开始----------"); IAsyncResult ret = func.BeginInvoke(, , ShowFolderSize,""); Console.WriteLine("计算开始:"); Console.WriteLine("-----------程序运行结束----------"); Console.ReadKey();
} public static void ShowFolderSize(IAsyncResult result)
{
int c = func.EndInvoke(result);
Console.WriteLine("计算完成,结果为:{0}",c);
}

3.1 运行结果:

 3.2 注意回调方法的返回值类型是void,只能有一个IAsyncResult类型的参数,并且要在方法体中调用EndInvoke来取回方法执行的结果,另外result参数的AsyncState属性包含了外界传入的参数信息。

C#中委托实现的异步编程的更多相关文章

  1. 使用C#委托来实现异步编程

    最近在我参与的几个.Net项目中都有用到异步编程,作为一名.Net小白,很有必要好好地学习一下异步编程. 什么是异步编程 异步编程指的就是不用阻塞当前线程来等待任务的完成,而是将任务扔到线程池中去执行 ...

  2. .NET 中的 async/await 异步编程

    原文出处: Teroy 的博客 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关 ...

  3. 在Python中使用asyncio进行异步编程

    对于来自JavaScript编码者来说,异步编程不是什么新东西,但对于Python开发者来说,async函数和future(类似JS的promise)可不是那么容易能理解的. Concurrency ...

  4. ASP.Net中的async+await异步编程

    在.NET Framework4.5框架.C#5.0语法中,通过async和await两个关键字,引入了一种新的基于任务的异步编程模型(TAP).在这种方式下,可以通过类似同步方式编写异步代码,极大简 ...

  5. 基于委托的C#异步编程的一个小例子 带有回调函数的例子

    我创建的是一个winform测试项目:界面如下: 设置: 下面是代码: using System; using System.Collections.Generic; using System.Com ...

  6. 全面解析C#中的异步编程

    当我们处理一些长线的调用时,经常会导致界面停止响应或者IIS线程占用过多等问题,这个时候我们需要更多的是用异步编程来修正这些问题,但是通常都是说起来容易做起来难,诚然异步编程相对于同步编程来说,它是一 ...

  7. 深入理解nodejs中的异步编程

    目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...

  8. C# 异步编程1 APM模式异步程序开发

    C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请 ...

  9. C# 异步编程1 APM 异步程序开发

    C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请 ...

随机推荐

  1. OpenCascade BRep Format Description (2)

    OpenCascade BRep Format Description eryar@163.com 摘要Abstract:本文结合OpenCascade的BRep格式描述文档和源程序,对BRep格式进 ...

  2. 简明 Git 命令速查表

    本文总结了git常用的命令,以便学习者使用时查阅~   几个专用名词的译名如下 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote ...

  3. Windows 下搭建 Ruby 开发环境

    1.从http://rubyinstaller.org/downloads/下载“rubyinstaller-2.1.5-x64.exe”. 2. 双击下载的程序进行安装,勾选如下图的选项.默认安装目 ...

  4. Nodejs学习笔记(一)——初识Nodejs

    前言:目前工作的分内之事相对较为单一,希望可以通过工作之余的时间给自己充充电,只是没有一个学伴或大神带,只能说是摸索着前进.起初准备好好研究下Spring这个框架,下载了源码,结合书籍准备一探究竟,看 ...

  5. 开发人员看测试之TDD和BDD

    前言: 已经数月没有来园子了,写博客贵在坚持,一旦松懈了,断掉了,就很难再拾起来.但是每每看到自己博客里的博文的浏览量每天都在增加,都在无形当中给了我继续写博客的动力.最近这两天有听到Jbehave这 ...

  6. LeetCode - 120. Triangle

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  7. Android数据库表的创建和数据升级操作

    之前的文章有提到,可以在xml文件中配置数据库信息:http://www.cnblogs.com/wenjiang/p/4492303.html,现在就讲如何利用这些信息类构建数据库. xml文件大概 ...

  8. vim黏贴自动增加tab的毛病

    vim在ctrl + p的时候有可能会自动给你增加了个tab 很是郁闷   解决方法如下: :set noautoindent :set nosmartindent

  9. Ubuntu14.04安装JDK

    下载oracle jdk包 从oracle官网下载jdk包,请选择Linux的tar包: 如果想使用命令行下载工具进行下载,可以先获得下载地址,然后运行curl进行下载: curl -L -O -H ...

  10. 一对多关系domain Model中设置使用AutoMapper时出错

    在使用AutoMapper时,把数据从VO-PO时显示如下错误,错误提示说在一对多关系中已将集合设置为EntityCollection,那么这个是为什么呢. 看下action中的代码,我们可以发现这是 ...