七:初探異步編程
阿新 • • 發佈:2018-10-31
成對出現 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); returnTotal; } 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<類型>中的類型
七:初探異步編程