由于一直在从事C++方面的工作,所以C#用的比较少,最近半年来公司使用WPF,所以C#的一些东西还需要好好补一补,今天来说一下async与await的使用方法。
我先说一下async,这其实是个语法糖,微软帮我们做了很多工作,但是作为使用者,我现在还不想去关注具体是怎么实现的,我现在的理解就是使用async告诉调用者这是一个异步方法。如果async方法中没有await,那么这个函数会被当做同步方法来执行,如下:
static void Main(string[] args)
{
Console.WriteLine("Before call async");
Test1();
Console.ReadKey();
}
static async Task<string> Test1()
{
Thread.Sleep(5000);
return "result";
}
上面代码会按照普通的调用去执行。如何才能实现异步调用呢,其实很简单,我们只需要把耗时的操作放在async函数中,使用await等待就可以了,具体操作如下:
static void Main(string[] args)
{
Console.WriteLine("Before call async");
var t=CallTestAsync("LinTao");
for (int i = 0; i < 10; i++)
{
Thread.Sleep(500);
Console.WriteLine(i);
}
Console.WriteLine($"异步方法执行的结果是{t.Result}");
//根据t的结果来决定下一步怎么做
t.ContinueWith(tt=>Console.WriteLine($"Continue{tt.Result}"),CancellationToken.None);
Console.ReadKey();
}
//拥有await的方法会被阻塞,但是调用该方法的会立即返回
private static async Task<string> CallTestAsync(string Name)
{
Console.WriteLine("Before Call Sleep");
var ret= await Task.Run(()=>Sleep(Name));
Console.WriteLine("After Call Sleep");
Console.WriteLine($"结果是{ret}");
return ret;
}
//耗时的方法
private static string Sleep(string Name)
{
Console.WriteLine($"Before {Name} Sleep");
Thread.Sleep(7000);
Console.WriteLine($"After {Name} Sleep");
return $"{Name}'s Final name is {Name}+{Name}+{Name}";
}
如上所示,耗时的操作我们都放在Sleep()这个普通的函数里面,在CallTestAsync()这个异步方法里面我们采用await去等待耗时方法完成,并得到结果。但是作为主线程Main()函数里面发现async CallTestAsync()这个函数里面有await会立即返回到Main函数,不会等待CallTestAsync()这个函数执行完毕才返回主线程,所以有兴趣的同学可以把代码拷贝过去看一下结果,这里就不做赘述了。
今天就先看到这里,有一点很重要async里面如果没有await那么就与普通的同步方法并无二异,有了await就不一样了,会立即返回到调用线程。如果有错误欢迎大家指出来。