Async 和 Await 的理解
Async 和 Await 的理解

Async 和 Await 的理解

在之前的工作中因为并发和响应的速度并没有怎么使用异步,但是最近的工作开始需要使用一步了。现在根据这几天的使用和在网上的学习进行一下总结。

在我的理解中 Async 和 Await 的使用是为了解决在访问某个方法时,这个方法需要长时间调用,并且这个方法是孤立的(或者在很后面需要返回值进行操作),而产生的解决办法。在这个方法上添加 Async 的装饰,调用这个方法我认为会开辟一个子线程run这个需要长时间调用的方法,并且执行后续的代码。如果需要返回值,就在遇到需要这个返回值之前加上 Await 这样就会等待返回值,直到有返回之后才会进行后续的操作。

    public class Threaded : BaseTest
    {
        public override void Run()
        {
            Console.WriteLine("start Threaded");
            Console.WriteLine("Current Process ID " + Thread.CurrentThread.ManagedThreadId);
            TaskAction1();
            
            string test2 = "Test 2";
            Task<int> value = TaskAction2(test2);
            Console.WriteLine("Test 2 Process ID " + value.Result);
            Console.WriteLine("complete Threaded");
        }

        public async void TaskAction1()
        {
            await Task.Run(() =>
            {
                Console.WriteLine("Test 1 Pending...");
                Thread.Sleep(5000);
                Console.WriteLine("Test 1 Task Process ID " + Thread.CurrentThread.ManagedThreadId);
                Console.WriteLine("Test 1 Complete");
            });
            Console.WriteLine("Test 1 Process ID " + Thread.CurrentThread.ManagedThreadId);
        }

        public async Task<int> TaskAction2(string item)
        {
            await Task.Run(() => {
                Console.WriteLine("Test 2 Pending...");
                Thread.Sleep(3000);
                Console.WriteLine(item);
                Console.WriteLine("Task 2 Complete");
            });
            return Thread.CurrentThread.ManagedThreadId;
        }
    }

由此可见主线程是一个线程,Test1 和 Test2 开始运行的时间间隔并不长,而且运行 Test1 的时候是一个线程(9),运行 Test2 的时候是另一个线程,并且因为 Test2 有返回值,在得到 Test2 的返回值后才进行后续的操作,而 Test1 是在执行完所有代码之后才姗姗来迟。所以我理解的 Async 和 Await 的使用是用资源来换取时间。如果是按顺序执行那将先等待 Test1 做完,再等待 Test2 做完,会浪费很多时间,在多并行的应用中可以适当的用资源换取时间。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注