使用async await 的前提条件:需要C# 5.0以上版本 .NET Framework 4.5以上 Visual Studio 2012以上。
async是用来修饰方法,表示此方法可以是异步方法,如果方法里不包含await,则此方法相当于普通的同步方法。
await是使用在被async修饰的方法里。
await 后面跟上一个异步操作Task,当程序执行到此行代码时,由于有await的修饰,会等待异步操作Task执行,Task执行完成后才会执行此方法里await这一行后面的代码,
但是外部调用async方法的地方,不会等待Task完成,就执行后面的代码。
class Program
{
static void Main(string\[\] args)
{
Console.WriteLine("Main function begin...CurrentThread ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
Test();
Console.WriteLine("Main function end");
Console.ReadLine();
}
public static async void Test()
{
Console.WriteLine("test begin...CurrentThread ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
await Task.Run(()=>{ Work1(); });
await Task.Run(() => { Work2(); });
await Task.Run(() => { Work3(); });
Console.WriteLine("test end---");
}
public static void Work1()
{
Console.WriteLine("Work1 start...CurrentThread ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
Thread.Sleep(6000);
Console.WriteLine("Work1 end---");
}
public static void Work2()
{
Console.WriteLine("Work2 start...CurrentThread ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
Thread.Sleep(6000);
Console.WriteLine("Work2 end---");
}
public static void Work3()
{
Console.WriteLine("Work3 start...CurrentThread ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
Thread.Sleep(6000);
Console.WriteLine("Work3 end---");
}
}
从上面的结果可以看出,Test()是一个被async修饰的异步方法,方法内有三个await的Task,所以这三个Task会依次执行
而调用异步方法Test的Main函数,则在Test方法执行完之前就运行了Test()后面的语句
Console.WriteLine("Main function end");
无需等待Test()方法的结果
需要把调用的异步函数变为普通的执行顺序,即非异步执行顺序
只需要一句: Task.Run(async () => { await Test(); }).Wait();
var result = Task.Run(async() => await yourAsyncMethod()).Result;
对于没有返回值的异步函数:
Task.Run(async () => { await yourAsyncMethod(); }).Wait();
手机扫一扫
移动阅读更方便
你可能感兴趣的文章