C#-等待异步函数执行结果-将调用异步方法的函数变成非异步执行
先来简单了解一下async、await
使用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();