async/await详解


一、async/await使用场景

同步情况下,实现异步

二、async/await使用和返回值

async可以单独使用,但是await必须放置在Task前面,而且必须配合async使用
async/await,await将原本没有返回值,返回void或者Task,原本返回X类型的返回Task,一般来说尽量不要在返回void,因为不能await

三、Demo解析

代码如下(示例):

namespace AsyncAwait
{
    class Program
    {
        
        static void Main(string[] args)
        {
            Test t = new Test();
            //t.NoReturn();
            t.ReturnTask();
            Console.WriteLine("Hello World!");
            Console.Read();
        }
    }

    public class Test
    {
        public void NoReturn()
        {
            Console.WriteLine($"This NoReturn Start {Thread.CurrentThread.ManagedThreadId}");
            Task task = Task.Run((() =>
            {
                Console.WriteLine($"This NoReturn Task Start {Thread.CurrentThread.ManagedThreadId}");
                Thread.Sleep(2000);
                Console.WriteLine($"This NoReturn Task End {Thread.CurrentThread.ManagedThreadId}");
            }));
            task.ContinueWith(t => Console.WriteLine($"This ContinueWith NoReturn End {Thread.CurrentThread.ManagedThreadId}"));
            //Console.WriteLine($"This NoReturn End{Thread.CurrentThread.ManagedThreadId}");
        }
        public async void NoReturnAsync()
        {
            Console.WriteLine($"This NoReturnAsync Start {Thread.CurrentThread.ManagedThreadId}");
            Task task = Task.Run((() =>
            {
                Console.WriteLine($"This NoReturnAsync Task Start{Thread.CurrentThread.ManagedThreadId}");
                Thread.Sleep(2000);
                Console.WriteLine($"This NoReturnAsync Task End{Thread.CurrentThread.ManagedThreadId}");
            }));
            await task;
            Console.WriteLine($"This NoReturnAsync End{Thread.CurrentThread.ManagedThreadId}");
        }
        public async Task ReturnTask()
        {
            Console.WriteLine($"This NoReturn Start {Thread.CurrentThread.ManagedThreadId}"); //调用线程执行
            Task task = Task.Run((() =>  //Task的子线程完成
            {
                Console.WriteLine($"This NoReturn Task Start {Thread.CurrentThread.ManagedThreadId}");
                Thread.Sleep(2000);
                Console.WriteLine($"This NoReturn Task End {Thread.CurrentThread.ManagedThreadId}");
            }));
            await task; //调用线程回去忙自己的事儿
            Console.WriteLine($"This NoReturn End {Thread.CurrentThread.ManagedThreadId}");//Task子线程完成 如果没有
            //await 那么应该是调用线程执行 ,可以认为,加了await就等于将await后面的代码,包装城一个回调,等同于     task.ContinueWith,其实
            //回调的线程具备多种可能性

            await Task.Run((() =>
            {
                Console.WriteLine($"This ReturnTask2 Task Start {Thread.CurrentThread.ManagedThreadId}");
                Thread.Sleep(2000);
                Console.WriteLine($"This ReturnTask2 Task End {Thread.CurrentThread.ManagedThreadId}");
            }));
            Console.WriteLine($"This NoReturn2 End {Thread.CurrentThread.ManagedThreadId}");
        }

        public long ReturnLong()
        {
            Console.WriteLine($"The Return Long Start{Thread.CurrentThread.ManagedThreadId}");
            long result = 0;
            Task task = Task.Run(() =>
            {
                Console.WriteLine($"The Return Long Task Start{Thread.CurrentThread.ManagedThreadId}");
                for (int i = 0; i < 100000; i++)
                {
                    result += i;
                }
                Console.WriteLine($"The Return Long Task End{Thread.CurrentThread.ManagedThreadId}");
                return result;
            });
            
            Console.WriteLine($"The Return Long End{Thread.CurrentThread.ManagedThreadId}");
            return result;
        }

        public async Task<long> ReturnLongAwait()
        {
            Console.WriteLine($"The Return Long Await Start{Thread.CurrentThread.ManagedThreadId}");
            long result = 0;
            Task task = Task.Run(() =>
            {
                Console.WriteLine($"The Return Long Await Task Start{Thread.CurrentThread.ManagedThreadId}");
                for (int i = 0; i < 100000; i++)
                {
                    result += i;
                }
                Console.WriteLine($"The Return Long Await Task End{Thread.CurrentThread.ManagedThreadId}");
                return result;
            });
            await task;
            Console.WriteLine($"The Return Long End{Thread.CurrentThread.ManagedThreadId}");
            return result;
        }
    }
}



<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

# 总结
<font color=#999AAA >提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值