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,才会真正的去创建线程
上一篇: 谷歌TPU项目核心成员离职 他们想建
推荐阅读
-
JS中async/await实现异步调用的方法
-
JS中async/await实现异步调用的方法
-
C# 委托异步 和 async /await 两种实现的异步
-
.net4.5新特性之异步编程(Async和Await)的使用
-
使用async和await的异步编程
-
常见的异步方式async 和 await
-
Async 和 Await 的异步编程 资料汇总
-
async 和 await 之异步编程的学习
-
js中promise方案、async和await方案和传统方案来处理异步回调的问题
-
那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)