C#asyncawit嵌套异步执⾏顺序分析使⽤⾮异步⽅法调⽤可异步⽅法(内含嵌套异步)
效果图:
代码(在控制台mian函数中运⾏该函数):
private static void AsyncTest()
{
Func<Task<string>> Fun1 = () =>
{
Thread.Sleep(4000);
Console.WriteLine("Fun1 Open");
return Task.Run(()=>
{
Thread.Sleep(2000);
Console.WriteLine("Fun1 Run Open");
Console.WriteLine("..............................");
Thread.Sleep(5000);
Console.WriteLine("..............................");
Console.WriteLine("Fun1 Run Close");
return "Fun1";
});
};
Func<Task<string>> Fun2 = async () =>
{
Thread.Sleep(1000);
Console.WriteLine("Fun2 Open");
var str2 = await Fun1();
Thread.Sleep(1000);
Console.WriteLine("Fun1 Result "+ str2);
Console.WriteLine("Fun2 Close");
return "Fun2";
};
Console.WriteLine("Asyn Open");
var str = Fun2();
Console.WriteLine("Fun2 Result " + str);
Console.WriteLine("Asyn Close");
}
情景:
1. 两个异步程序Fun2/Fun1
2. Fun2使⽤(await)调⽤Fun1
3. Fun2不使⽤异步调⽤
分析:
1. 主线程执⾏过程中,遇到异步Fun2,执⾏同步过程,进⼊函数Fun2
2. 函数Fun2执⾏过程中,遇到异步Fun1,执⾏异步过程await,进⼊Fun1
3. 函数Fun1执⾏过程中,遇到异步时间Run,开启异步
4. 主函数不等待异步,Fun1⽆返回值,输出Task对象
5. 函数Fun2等待Fun1结果,再执⾏await后的语句
结论:
1. 封装后的异步调⽤,如果被同步调⽤,应该使⽤void/Task⽆返回值⽅式
2. await后的语句,相当于异步调⽤后的回调⽅法,写法更美观
使⽤await调⽤异步⽅法(嵌套异步)
代码:
var str = await Fun2();
在上⽂代码中Fun2函数前⾯加上await
效果图:
分析:
1. 主线程执⾏过程中,遇到异步Fun2,执⾏异步过程await,进⼊函数Fun2
2. 函数Fun2执⾏过程中,遇到异步Fun1,执⾏异步过程await,进⼊Fun1
3. 函数Fun1执⾏过程中,遇到异步时间Run,开启异步
4. 函数Fun2等待Fun1结果,再执⾏await后的语句
5. 主函数等待Fun2结果,再执⾏await后的语句
结论:
1. 要想达到嵌套异步的回调效果,每⼀个异步环节都要使⽤await标记分割使⽤await调⽤异步⽅法(连续await)
效果图
代码:
Fun1添加参数p做区分,Fun2添加并⾏的await
Func<string, Task<string>> Fun1 = (string p) =>
{
Thread.Sleep(4000);
Console.WriteLine("Fun1 Open " + p);
return Task.Run(()=>
{
Thread.Sleep(2000);
Console.WriteLine("Fun1 Run Open " + p);writeline函数
Console.WriteLine("..............................");
Thread.Sleep(5000);
Console.WriteLine("..............................");
Console.WriteLine("Fun1 Run Close " + p);
return "Fun1 " + p;
});
};
Func<Task<string>> Fun2 = async () =>
{
Thread.Sleep(1000);
Console.WriteLine("Fun2 Open");
var str2 = await Fun1("No.1");
Thread.Sleep(1000);
Console.WriteLine("Fun1 Result "+ str2);
str2 = await Fun1("No.2");
Thread.Sleep(1000);
Console.WriteLine("Fun1 Result " + str2);
Console.WriteLine("Fun2 Close");
return "Fun2";
};
结论:
1. 多个await并不会破坏await的“异步回调模式”
2. 在上⼀个await执⾏回调后,下⼀个await作为回调函数内的语句继续执⾏await的过程
3. 该语法糖很好吃,很强⼤的语法,拯救了键盘。
注意:
await异步回调的边界,是async所标记的函数的边界。其async函数内部的循环/判断等语句,都要服从与await的等待与回调过程。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论