标签: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