110,476
社区成员
发帖
与我相关
我的任务
分享
static void Main(string[] args)
{
Async1();
Console.WriteLine("...............按任意键退出");
Console.ReadKey();
}
static void Async1()
{
Task.Run(delegate
{
var r = Async2();
var x = Async3(r);
Console.WriteLine("结果是 {0}", r + x);
});
}
static int Async2()
{
Thread.Sleep(1000);
return 100;
}
static int Async3(int x)
{
Thread.Sleep(1000);
return x % 7;
}
static async Task ThrowNotImplementedExceptionAsync()
{
throw new NotImplementedException();
}
Async1(()=>
{
Async2(r=>
{
Async3(r, x=>
{
Console.WriteLine("结果是 {0}", r+x);
});
}
});
这种异步切多线程(子线程)需求流程,我们用 async/await 时就简写为static void Main(string[] args)
{
Async1();
Console.WriteLine("...............按任意键退出");
Console.ReadKey();
}
static async Task Async1()
{
var r = await Async2();
var x = await Async3(r);
Console.WriteLine("结果是 {0}", r + x);
}
static async Task<int> Async2()
{
await Task.Delay(1000);
return 100;
}
static async Task<int> Async3(int x)
{
await Task.Delay(1000);
return x % 7;
}
这种代码,那么看起来嵌套少了、代码整洁了。
但是要清楚的是,其实这是对人的素质要求提高了。因为对于稍微复杂一点的程序,你要调试跟踪代码 bug,你得懂得 async/await 的原理机制,才可能有调试跟踪的思路,不然如果满脑子还是”顺序、同步“的思路就会在开发中”死得很惨“了。
所以我说,async/await 也是有它双刃剑的一面,容易被一些小白当作高大上的标题党,写出一堆蒙出来的、无法真正分析出来时序流程和测试维护方案的代码。static void Main(string[] args)
{
Async3(() =>
{
Console.WriteLine("Async3完毕,执行了回调");
});
Console.WriteLine("...............按任意键退出");
Console.ReadKey();
}
那么这里只知道 Async3会按照协议而异步回调我注册的 Console.WriteLine 代码,至于说是不是在子线程回调、是不是在Async3完成之后才回调(在 Async3完成之后过一会才回调,也完全可能是注册到主线程去回调),这里并没有说明。
那么只有看懂了 Async3 里边的机制,才知道实际运行时结果。例如static void Main(string[] args)
{
Async3(() =>
{
Console.WriteLine("Async3完毕,执行了回调");
});
Console.WriteLine("...............按任意键退出");
Console.ReadKey();
}
static void Async3(Action callback)
{
Console.WriteLine("异步");
callback();
}
这其实就总是先执行 Async3然后才中Main中其它代码,而如果写static void Main(string[] args)
{
Async3(() =>
{
Console.WriteLine("Async3完毕,执行了回调");
});
Console.WriteLine("...............按任意键退出");
Console.ReadKey();
}
static void Async3(Action callback)
{
Task.Run(() =>
{
Console.WriteLine("异步");
callback();
});
}
这几乎就是总是最后才执行Async3中的代码。
所以,“异步”是一种编程模式,就好像乐视的财务对员工说“你们别为了讨要薪水在这儿绝食抗议了,我有了钱肯定先发给你”,那么财务是真的第一时间发工资还是要等老板转移了资产之后才发工资,只有他自己心里最清楚。但是他表面上做足了“异步接口”了!