1. 程式人生 > >七:初探異步編程

七:初探異步編程

成對出現 aps int mil sin 類型 正常的 esp readline

同步編程

創建類

using System;
using System.Diagnostics;

namespace TestAsyncConsole
{
    public class NormalClass
    {
        Stopwatch sw = new Stopwatch();

        public void DoSomething()
        {
            const int largeNumber = 600000;
            sw.Start();
            int t1 = CountChar(1,largeNumber);
            
int t2 = CountChar(2,largeNumber); LongProcess(largeNumber); LongProcess(largeNumber); LongProcess(largeNumber); Console.WriteLine("1: {0}",t1); Console.WriteLine("2: {0}",t2); } private int CountChar(int id,int Number) {
int Total = 0; Console.WriteLine("開始調用{0} :{1,4} ms",id,sw.Elapsed.TotalMilliseconds); for (int i = 0; i < Number;i++ ) { Total += i; } Console.WriteLine("結束調用{0} :{1,4} ms",id,sw.Elapsed.TotalMilliseconds); return
Total; } private void LongProcess(int largeNumber) { for(int i=0;i<largeNumber;i++) { } Console.WriteLine(" 時長: {0,4} 毫秒",sw.Elapsed.TotalMilliseconds); } } }

調用該類

    class Program
    {
        static void Main(string[] args)
        {
            NormalClass normal = new NormalClass();
            normal.DoSomething();
            Console.ReadLine();
        }
    }
}

得到結果

技術分享圖片

異步編程

using System;
using System.Diagnostics;
using System.Threading.Tasks;

namespace TestAsyncConsole
{
    public class AsyncClass
    {
        Stopwatch sw = new Stopwatch();

        public void DoSomething()
        {
            const int largeNumber = 600000;
            sw.Start();
            var t1 = CountChar(1, largeNumber);
            var t2 = CountChar(2, largeNumber);
            LongProcess(largeNumber);
            LongProcess(largeNumber);
            LongProcess(largeNumber);
            Console.WriteLine("1: {0}", t1.Result);
            Console.WriteLine("2: {0}", t2.Result);
        }

        private async Task<int> CountChar(int id, int Number)
        {
            int Total = 0;
            Console.WriteLine("開始調用{0} :{1,4} ms", id, sw.Elapsed.TotalMilliseconds);
            Total = await Task.Run(()=>
                {
                    for (int i = 0; i < Number; i++)
                    {
                        Total += i;
                    }
                    return Total;
                }
                );
            Console.WriteLine("結束調用{0} :{1,4} ms", id, sw.Elapsed.TotalMilliseconds);
            return Total;
        }

        private void LongProcess(int largeNumber)
        {
            for (int i = 0; i < largeNumber; i++)
            {
            }
            Console.WriteLine("  時長: {0,4} 毫秒", sw.Elapsed.TotalMilliseconds);
        }
    }
}

調用該異步類得到的結果如下

技術分享圖片

可以看到雖然代碼中LongProcess都在調用方法CountChar之後,但是實際執行的結果順序卻不是按照代碼中的順序。

總結異步同步編程的差異

  • 關鍵字只有兩個Async和Await
  • Async和Await必須成對出現,否則就又會變成同步
  • Async用在異步方法的返回值修飾上
  • Await比較特殊,這裏需要新建一個Task,也就是說必須是有一個新線程來處理異步
  • 異步的方法返回值和正常的返回值不同,正常的返回值是類型,而異步的返回值是Task<類型>
  • 獲取結果的方法不是使用返回值,因為返回值的類型是Task<類型>,而是使用返回值.Result。其中這個Result的類型才是Task<類型>中的類型

七:初探異步編程