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<int> 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<int> t = Test1();
            int a = t.Result;
            Test1();
             
            Console.WriteLine("结束");
 
            Console.ReadLine();
        }
 
        static async Task<int> Test1()
        {
            await Task.Delay(500);
            Console.WriteLine("2");
            return 2;
        }

猜你喜欢

转载自blog.csdn.net/weixin_40068689/article/details/82768639