async/await|async/await 与 Task的区别 (笔记)

使用场景:
你要同步上下文且不阻塞UI 用async + await 包装 实现了用同步编程的写法实现异步
举个例子:
(Task的场景)你有个监控界面,点击一个开始按钮,你用Task异步启动一个B函数经过一段时间计算吧结果显示到界面对吧Task用的很好。
(asnyc+await的场景) 你有个登录界面,输入用户信息后你点击登录按钮,这个时候你用为了不阻塞UI 你用Task异步执行B函数去对比数据库的用户信息对吧。但是这样做就直接跳转到了下一个界面了,没有等待你的B函数的结果啊。你的意图是要有了B函数结果再去判断是否进入下一个界面,那么这个时候你又要同步模式组织逻辑又要不阻塞UI 怎么办呢?以前用回调在回调函数里处理逻辑,现在用asnyc+await以同步方式实现异步就可以更加方便的解决这个问题了。

代码例子:

namespace ConsoleApp1 { class Program { static async Task ces2() { await Task.Delay(100); //(模拟sql查询耗时) Console.WriteLine("子线程"); return 2; } static async void test() { Console.WriteLine("结果是{0}", await ces2()); //(等待sql查询结果,做相应的反应) } static void Main(string[] args) { //主线程 UI DateTime st = DateTime.Now; Console.WriteLine("主线程开始"); test(); Console.WriteLine("主线程结束。按任意键结束......"); Console.ReadKey(); } } }

使用Task异步过程中尽量避免使用Task.Result,因为使用Result时,程序就需要等待异步执行完毕,这是不符合异步思想的。
当async await一起使,是异步。
当仅仅是Task.Result时,是同步(没有意义)。
测试代码:
static void Main(string[] args) { Console.WriteLine("开始"); Task t = Test1(); int a = t.Result; Test1(); Console.WriteLine("结束"); Console.ReadLine(); } static async Task Test1() { await Task.Delay(500); Console.WriteLine("2"); return 2; }



【async/await|async/await 与 Task的区别 (笔记)】

    推荐阅读