async/await 的使用

Posted j2ee-web-01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了async/await 的使用相关的知识,希望对你有一定的参考价值。

async :

使用 async 修饰符可将方法、lambda 表达式匿名方法指定为异步。 如果对方法或表达式使用此修饰符,则其称为异步方法

await:

await 运算符应用于异步方法中的任务,在方法的执行中插入挂起点,直到所等待的任务完成,返回线程池任务表示正在进行的工作。

 

 

 区别:

     同步方法:一个程序调用某个同步方法,等到其执行完成之后才进行下一步操作。这也是默认的形式。
     异步方法:一个程序调用某个异步方法(创建线程 【线程池】),取处理完成之前就返回该方法,并继续往下执行其他代码。

 

 

 执行流程:

技术图片

异步用例:

只有拥有async才能在其内部使用await关键字。异步方法可以具有Task、Task<>或void的返回类型;

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主线程测试开始..");
            AsyncMethod();
            Thread.Sleep(1000);
            Console.WriteLine("主线程测试结束..");
            Console.ReadLine();
        }

        static async void AsyncMethod()
        {
            Console.WriteLine("开始异步代码");
            var result = await MyMethod();//var result = MyMethod().Result
            Console.WriteLine("异步代码执行完毕");
        }

        static async Task<int> MyMethod()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("异步执行" + i.ToString() + "..");
                await Task.Delay(1000); //模拟耗时操作
            }
            return 0;
        }
    }

 

Thread多线程异步编程例子:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主线程测试开始..");
            Thread th = new Thread(ThMethod);
            th.Start();
            Thread.Sleep(1000);
            Console.WriteLine("主线程测试结束..");
            Console.ReadLine();
        }
     
     
        static void ThMethod()
        {
            Console.WriteLine("异步执行开始");
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("异步执行" + i.ToString() + "..");
                Thread.Sleep(1000);
            }
            Console.WriteLine("异步执行完成");
        }
    }


 

 

 

参考:   https://www.cnblogs.com/jara/p/3405098.html   //线程池传送门

    https://www.cnblogs.com/yifengjianbai/p/5499493.html

    https://www.cnblogs.com/color-wolf/p/5448458.html

    https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/async/

    https://www.cnblogs.com/chengjun/p/5366047.html

 



以上是关于async/await 的使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Async/Await 控制哪些代码停止

[译]async/await中使用阻塞式代码导致死锁

Gulp/Typescript/Async/Await 代码不起作用 - 为啥?

如何使用 async/await 处理错误?

js异步回调Async/Await与Promise区别 新学习使用Async/Await

Python 3.5 async/await 与真实代码示例