码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2019-01-08 19:22:40      阅读:477      评论:0      收藏:0      [点我收藏+]

标签:static   指正   tpc   线程   rgs   sync   自己   wait   pcl   

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

首先是 委托实现的异步

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,才会真正的去创建线程

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

标签:static   指正   tpc   线程   rgs   sync   自己   wait   pcl   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!