C# 委托异步 和 async /await 两种实现的异步

最近频繁使用异步所以自己综合的学习了一把异步相关的知识,自己稍加整理了一下(这也是我试着写的第一篇,如果有不对的,希望大神来指正!)

首先是 委托实现的异步

class Program
{

public delegate int weituo();//定义了个委托

public int xxx()
{
Thread.Sleep(3000);
Console.WriteLine("11111.");

return 1;
}

///定义了个方法

static void Main(string[] args)
{

weituo a  =new weituo(new Program().xxx);

IAsyncResult result= a.BeginInvoke(null,null);

Console.WriteLine("1234");
Thread.Sleep(1000);
int i= a.EndInvoke(result);
Console.WriteLine("1235");
Console.WriteLine(i.ToString());
Console.ReadLine();

}

}

执行结果如下;

接着是 async /await 的异步实现

class Program
{

public static async void xxx()
{
int i = 0;
await Task.Run(() =>
{
new Program().xxxa();
});
Console.WriteLine("123");
}
public async Task<int> xxxa()
{
Thread.Sleep(3000);
Console.WriteLine("11111.");
return (2);
}
static void Main(string[] args)
{
xxx();
Console.WriteLine("1234");
Console.WriteLine("1235"); 
Console.ReadLine();

}
}

执行结果

如果将

public static async void xxx()
{
int i = 0;
await Task.Run(() =>
{
new Program().xxxa();
});
Console.WriteLine("123");
}

改为

public static async void xxx()

{
int i = 0;
await new Program().xxxa();
Console.WriteLine("123");
}

结果变为

说明,async与await关键字本身并不会产生多线程;

await 不会开启新的线程,当前线程会一直往下走直到遇到真正的Async方法(比如说HttpClient.GetStringAsync),这个方法的内部会用Task.Run或者Task.Factory.StartNew 去开启线程。也就是如果方法不是.NET为我们提供的Async方法,我们需要自己创建Task,才会真正的去创建线程

原文地址:https://www.cnblogs.com/wangsenyuan/p/10240201.html

时间: 2024-08-25 17:15:01

C# 委托异步 和 async /await 两种实现的异步的相关文章

异步编程Async/await关键字

异步编程Async \await 关键字在各编程语言中的发展(出现)纪实. 时间 语言版本 2012.08.15 C#5.0(VS2012) 2015.09.13 Python 3.5 2016.03 ECMAScript 2016 (ES7) C#中的用法和浅层次原理 我是占位代理 Python中的用法,和协程 我是占位代理 Javascript中的说明 我是占位代理,不懂具体用法.

js callback promise async await 几种异步函数处理方式

***callback  这个是最常用的也是最简单的 ,比如在ajax网络请求中,返回请求完成返回的数据 回调函数就是把一个函数当成另一个函数的参数,可以传递函数内的局部变量,也可以异步完成一些操作,在函数的实现里调用回调函数,在函数的调用里实现回调函数 // 回調函數的方式 閉包 可以獲取函數內部的局部變量 function testCallback(callback) { let a = 1; let b = 2; if (a < b) { callback && callbac

关于异步执行(Async/await)的理解(转发)

原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异步编程的核心是使用多线程,通过让不同的线程执行不同的任务,实现不同代码的并行运行. 前台线程与后台线程 关于多线程,早在.NET2.0时代,基础类库中就提供了Thread实现.默认情况下,实例化一个Thread创建的是前台线程,只要有前台线程在运行,应用程序的进程就一直处于运行状态,以控制台应用程序

JavaScript异步编程——Async/Await vs Promise

兼容性 提醒一下各位,Node 现在从版本 7.6 开始就支持 async/await 了.而就在前几天,Node 8已经正式发布了,你可以放心地使用它. 如果你还没有试过它,这里有一堆带有示例的理由来说明为什么你应该马上采用它,并且再也不会回头. Async/await  对于那些从未听说过这个话题的人来说,如下是一个简单的介绍: Async/await 是一种编写异步代码的新方法.之前异步代码的方案是回调和 promise. Async/await 实际上是建立在 promise 的基础上.

[C#] 谈谈异步编程async await

为什么需要异步,异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源的访问有时很慢或会延迟. 如果此类活动在同步过程中受阻,则整个应用程序必须等待. 在异步过程中,应用程序可继续执行不依赖 Web 资源的其他工作,直至潜在阻止任务完成. 本节将一步一步带领大家理解async和await. 期间会有 Hello World,原理介绍,异步会提高程序的运行速度吗,async和await,MVC中的异步Action,以及线程中常涉及到的线程安全和信号量,以及微软提供

.net 异步编程async &amp; await关键字的思考

C# 5.0引入了两个关键字 async和await,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且TPL中的task与async和await有很大的关系 思考了一下异步编程中的async & await关键字,对两个关键字尤其是await关键字一直很迷糊,因此深入思考了一下.首先借助的示例是:[你必须知道的异步编程]C# 5.0 新特性--Async和Await使异步编程更简单这是博客园一个大牛写的,自己也一直关注这个大神,不得不说,博客园大神很多,而且氛围也很好.我引入了其中

异步编程async/await

什么是异步? 在异步程序中,程序代码不需要按照编写时的顺序严格执行,有时需要一在一个新的线程中运行一部分代码,有时无需创建新的 线程,但是为了更好的利用单个线程的能力,需要改变代码的执行顺序. 进程 启动程序时,系统会在内存中创建一个新的进程.进程是构成运行程序的资源的集合,这些资源包括虚地址空间.文件句柄和许多其他程序运行所需的东西. 线程 在进程内部,系统创建一个称为线程的内核对象,它代表了真正执行的程序.线程是执行线程的简称.一旦线程建立,系统会在Main方法的第一句开始线程的执行. 线程

异步(1) async &amp; await

1 什么是异步 异步的另外一种含义是计算机多线程的异步处理.与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程. 2 异步场景 l  不涉及共享资源,或对共享资源只读,即非互斥操作 l  没有时序上的严格关系 l  不需要原子操作,或可以通过其他方式控制原子性 l  常用于IO操作等耗时操作,因为比较影响客户体验和使用性能 l  不影响主线程逻辑 3 异步编写 C# Async  await关键字 Async method 三种返回

js异步回调Async/Await与Promise区别 新学习使用Async/Await

Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面一起来看看这篇文章:Async/Await替代Promise的6个理由. 什么是Async/Await? async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. async/await与Prom