async,await与task.wait()或task.Result的区别

Posted sosoeasy

tags:

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

你是否曾经与我一样不理解async,await与task.wait()或者task.Result的区别?

接下来,一个Demo让你看出他们之间的区别。

  static void Main(string[] args)
        {
            Console.WriteLine("start");
            Test(); //不等待
            Console.WriteLine("end");
            Console.Read();
        }

        static Task<int> Sleep()
        {
            Console.WriteLine("Sleep start");
            Thread.Sleep(1000);
            Console.WriteLine("Sleep end");
            return Task.FromResult(100);
        }
        
        static Task<int> Test()
        {
            Console.WriteLine("Test start");
            var a=Task.Run(Sleep).Result;//由上一篇文章可知Run将会在线程池内调度执行
            Console.WriteLine("Test end");
            return Task.FromResult(a);
        }

运行结果:

start
Test start
Sleep start
Sleep end
Test end
end

由此可以看出Task.Result会阻塞主线程。

 

        static void Main(string[] args)
        {
            Console.WriteLine("start");
            TestAsync();//不等待

            Console.WriteLine("end");
            Console.Read();
        }

        static Task<int> Sleep()
        {
            Console.WriteLine("Sleep start");
            Thread.Sleep(1000);
            Console.WriteLine("Sleep end");
            return Task.FromResult(100);
        }
        static async Task<int> TestAsync()
        {
            Console.WriteLine("Test start");
            var a = await Task.Run(Sleep);
            Console.WriteLine("Test end");
            return a;
        }

运行结果:

start
Test start
Sleep start
end
Sleep end
Test end

async,await不会阻塞主线程

 

以上是关于async,await与task.wait()或task.Result的区别的主要内容,如果未能解决你的问题,请参考以下文章

await vs Task.Wait - 死锁?

async 与 await

async 与 await

async 与 await

C# Async与Await的使用

错误:await 表达式只能在异步函数中使用。尝试用“async”或“async*”标记函数体