async,await與task.wait()或task.Result的區別


你是否曾經與我一樣不理解async,await與task.wait()或者task.Result的區別?

接下來,一個Demo讓你看出他們之間的區別。

  static void Main(string[] args)
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:start");

            Test(); //不等待
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:end");
            Console.Read();
        }

        static Task<int> Sleep()
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Sleep start");
            Thread.Sleep(1000);
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Sleep end");
            return Task.FromResult(100);
        }
        
        static Task<int> Test()
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Test start");
            var a=Task.Run(Sleep).Result;//由上一篇文章可知Run將會在線程池內調度執行
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Test end");
            return Task.FromResult(a);
        }

 

運行結果:

1:start
1:Test start
4:Sleep start
4:Sleep end
1:Test end
1:end

由此可以看出Task.Result會阻塞主線程。

 

 static void Main(string[] args)
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:start");

            TestAsync();//不等待

            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:end");
            Console.Read();
        }

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

運行結果:

1:start
1:Test start
4:Sleep start
1:end
4:Sleep end
4:Test end

async,await不會阻塞主線程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM