漂泊雪狼的博客

思考,讨论,分享C#,JavaScript,.NET,Oracle,SQL Server……技术

导航

一个例子看懂异步代码执行效率

Posted on 2016-06-04 11:12  漂泊雪狼  阅读(1102)  评论(0编辑  收藏  举报

异步代码采用线程池,提供代码执行的并行性,不阻塞当前线程,实例代码,模拟三个耗时操作,分别耗时为1000、1500、1800ms,提供同步与异步的实现方式,Main中以同步异步的方式执行,对比执行时间,同步执行方式为各个方法的执行时间总和,而异步执行方式为最长的那个时间。ps:实际执行情况可能有其他的一些微不足道开销,但大体能反应异步的执行效率。

  class OutHelper
    {
        public DateTime Method1()
        {
            Thread.Sleep(1000);
            return DateTime.Now;
        }

        public DateTime Method2()
        {
            Thread.Sleep(1500);
            return DateTime.Now;
        }

        public DateTime Method3()
        {
            Thread.Sleep(1800);
            return DateTime.Now;
        }

        public async Task<DateTime> AMethod1()
        {
            await Task.Delay(1000);
            return DateTime.Now;
        }

        public async Task<DateTime> AMethod2()
        {
            await Task.Delay(1500);
            return DateTime.Now;
        }

        public async Task<DateTime> AMethod3()
        {
            await Task.Delay(1800);
            return DateTime.Now;
        }
    }

 

class Program
    {
        static void Main(string[] args)
        {
            OutHelper oh = new OutHelper();

            Console.WriteLine("同步调用开始……");
            Stopwatch sw = new Stopwatch();
            sw.Start();

            DateTime d1 = oh.Method1();
            DateTime d2 = oh.Method2();
            DateTime d3 = oh.Method3();
            Console.WriteLine("同步:d1={0}, d2={1}, d3={2}", d1, d2, d3);
            Console.Out.Flush();
            sw.Stop();
            Console.WriteLine("同步调用耗时:{0}", sw.ElapsedMilliseconds);


            Console.WriteLine("异步调用开始……");

            sw.Reset();
            sw.Start();

            var ad1 = oh.AMethod1();
            var ad2 = oh.AMethod2();
            var ad3 = oh.AMethod3();

           Task.WhenAll(ad1, ad2, ad3);
            Console.WriteLine("同步:d1={0}, d2={1}, d3={2}", ad1.Result, ad2.Result, ad3.Result);
            Console.Out.Flush();
            sw.Stop();

            Console.WriteLine("异步调用耗时:{0}", sw.ElapsedMilliseconds);

            Console.ReadLine();
        }
    }

 

另外一种并行执行的方式:

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Stopwatch sw = new Stopwatch();
 6             sw.Start();
 7             Parallel.Invoke(Fun1, Fun2);
 8             sw.Stop();
 9             Console.WriteLine("cost2:{0}", sw.ElapsedMilliseconds);
10 
11             sw.Reset();
12             sw.Start();
13             Fun1();
14             Fun2();
15             sw.Stop();
16 
17             Console.WriteLine("cost2:{0}", sw.ElapsedMilliseconds);
18 
19         }
20 
21 
22 
23 
24         static void Fun1()
25         {
26             Thread.Sleep(1000);
27             Console.WriteLine("Fun1");
28         }
29 
30         static void Fun2()
31         {
32             Thread.Sleep(1500);
33             Console.WriteLine("Fun2");
34         }
35     }
使用 Parallel.Invoke方式实现