C#-等待异步函数执行结果-将调用异步方法的函数变成非异步执行
阅读原文时间:2023年07月08日阅读:1

先来简单了解一下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();