C#中委托实现的异步编程

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

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

1.0 同步例子:

 1 class Program
 2     {
 3         private static int Calculate(int a, int b)
 4         {
 5             Console.WriteLine("1.开始计算!");
 6
 7             System.Threading.Thread.Sleep(1000 * 3);//假如计算需要3秒钟
 8
 9             int c = a + b;
10
11             Console.WriteLine("2.计算完成,结果:{0}+{1}={2}", a, b, c);
12
13             return c;
14         }
15
16         static void Main(string[] args)
17         {
18             Console.WriteLine("---------程序运行开始----------");
19
20             Calculate(1, 2);
21
22             Console.WriteLine("---------程序运行结束----------");
23
24             Console.ReadKey();
25         }
26     }

1.1 运行结果:

2.0 改用异步调用

 1 static void Main(string[] args)
 2         {
 3             Console.WriteLine("-----------程序运行开始----------");
 4
 5             Func<int, int, int> action = Calculate;//声明一个委托
 6
 7             IAsyncResult ret = action.BeginInvoke(1, 2, null, null);
 8
 9             Console.WriteLine("1.我不参与计算,先走了啊!");
10
11             int amount = action.EndInvoke(ret);
12
13             Console.WriteLine("-----------程序运行结束----------");
14
15             Console.ReadKey();
16         }

2.1 运行结果:

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

 1 private static int Calculate(int a, int b)
 2         {
 3             System.Threading.Thread.Sleep(1000 * 10);//假如计算需要3秒钟
 4
 5             int c = a + b;
 6
 7             Console.WriteLine("\r\n计算完成,结果:{0}+{1}={2}", a, b, c);
 8
 9             return c;
10         }
11
12         static void Main(string[] args)
13         {
14             Console.WriteLine("-----------程序运行开始----------");
15
16             Func<int, int, int> action = Calculate;//声明一个委托
17
18             IAsyncResult ret = action.BeginInvoke(1, 2, null, null);
19
20             Console.WriteLine("我不参与计算,先走了啊!");
21
22             Console.WriteLine("正在努力计算:");
23             while (ret.IsCompleted == false)
24             {
25                 Console.Write(".");
26                 System.Threading.Thread.Sleep(1000);
27             }
28
29             int amount = action.EndInvoke(ret);
30
31             Console.WriteLine("-----------程序运行结束----------");
32
33             Console.ReadKey();
34         }

2.3 运行结果:

时间: 2025-01-15 03:23:17

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

.NET 中的 async/await 异步编程

前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关的知识,并整理成这篇博客,如果在阅读的过程中发现不对的地方,欢迎大家指正. 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异步编程的核心是使用多线程,通过让不同的线程执行不同的任务,实现不同代码的并行运行. 前台线程与后台线程 关于多线程,早在.NET2

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

我创建的是一个winform测试项目:界面如下: 设置: 下面是代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; usin

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

当我们处理一些长线的调用时,经常会导致界面停止响应或者IIS线程占用过多等问题,这个时候我们需要更多的是用异步编程来修正这些问题,但是通常都是说起来容易做起来难,诚然异步编程相对于同步编程来说,它是一种完全不同的编程思想,对于习惯了同步编程的开发者来说,在开发过程中难度更大,可控性不强是它的特点. 在.NET Framework5.0种,微软为我们系统了新的语言特性,让我们使用异步编程就像使用同步编程一样相近和简单,本文中将会解释以前版本的Framework中基于回调道德异步编程模型的一些限制以

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

C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请点下面的“关注我”.谢谢 我是2004年接触并使用C#的,那时C#版本为1.1,所以我们就从就那个时候谈起.那时后在大学里自己看书写程序,所写的程序大都是同步程序,最多启动个线程........其实在C#1.1的时代已有完整的异步编程解决方案,那就是APM(异步编程模型).如果还有不了解“同步程序.

简单地使用线程之一:使用异步编程模型

.NetFramework的异步编程模型从本质上来说是使用线程池来完成异步的任务,异步委托.HttpWebRequest等都使用了异步模型. 这里我们使用异步委托来说明异步编程模型. 首先,我们来明确一下,对于多线程来说,我们需要关注哪些问题. “线程是一段执行中的代码流”,从这句话中,我们可以关注这段代码流何时开始执行.何时结束.从主线程如何传递参数至从子线程.从子线程如何返回结果至主线程? 问题1:在异步编程模型中,子线程何时开始执行? 对于异步编程模型来说,使用BeginXXX来开始执行线

不得不说的异步编程

1.什么是异步编程? 异步编程就是把耗时的操作放进一个单独的线程中进行处理(该线程需要将执行进度反映到界面上).由于耗时操作是在另外一个线程中被执行的,所以它不会堵塞主线程.主线程开启这些单独的线程后,还可以继续执行其他操作(例如窗体绘制等). 异步编程可以提高用户体验,避免在进行耗时操作时让用户看到程序“卡死”的现象. 2.异步编程模型(APM) APM是Asynchronous Programming Mode的缩写,即异步编程模型的意思,它允许程序用更少的线程去执行更多的操作.在.NET

异步编程(二)基于事件的异步编程模式 (EAP)

一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式--APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题--不支持对异步操作的取消和没有提供对进度报告的功能,对于有界面的应用程序来说,进度报告和取消操作的支持也是必不可少的,既然存在这样的问题,微软当然也应该提供给我们解决问题的方案了,所以微软在.NET 2.0的时候就为我们提供了一个新的异步编程模型,也就是我这个专题中介绍的基于事件的异步编程模型--EAP. 实现了基于事件的异步模式的类将

基于事件的异步编程模式(EAP)

一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式--APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题--不支持对异步操作的取消和没有提供对进度报告的功能,对于有界面的应用程序来说,进度报告和取消操作的支持也是必不可少的,既然存在这样的问题,微软当然也应该提供给我们解决问题的方案了,所以微软在.NET 2.0的时候就为我们提供了一个新的异步编程模型,也就是我这个专题中介绍的基于事件的异步编程模型--EAP. 二.介绍 实现了基于事件的异步

Promise和异步编程

前面的话 JS有很多强大的功能,其中一个是它可以轻松地搞定异步编程.作为一门为Web而生的语言,它从一开始就需要能够响应异步的用户交互,如点击和按键操作等.Node.js用回调函数代替了事件,使异步编程在JS领域更加流行.但当更多程序开始使用异步编程时,事件和回调函数却不能满足开发者想要做的所有事情,它们还不够强大,而Promise就是这些问题的解决方案 Promise可以实现其他语言中类似Future和Deferred一样的功能,是另一种异步编程的选择,它既可以像事件和回调函数一样指定稍后执行