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();

 



posted @ 2022-09-27 14:48  派大没有星  阅读(849)  评论(0编辑  收藏  举报