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的区别 (笔记)】
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 第326天
- Shell-Bash变量与运算符
- 逻辑回归的理解与python示例
- Guava|Guava RateLimiter与限流算法
- 我和你之前距离
- CGI,FastCGI,PHP-CGI与PHP-FPM
- 原生家庭之痛与超越