使用场景:
你要同步上下文且不阻塞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;
}