提到异步,那么与之对应的是什么呢?同步。那么C#的异步和同步是如何事情的呢?
首先,我们先来看看栗子:
新建一个控制台应用措施,在Program文件中添加如下代码:
1 static void Main(string[] args) 2 { 3 //计时器 4 Stopwatch watch = new Stopwatch(); 5 //开始计时 6 watch.Start(); 7 Console.WriteLine($"{DateTime.Now.ToString()} 进入Main要领,执行线程:{System.Threading.Thread.CurrentThread.ManagedThreadId}"); 8 //挪用任务一(同步) 9 TaskOne(); 10 // 挪用任务二 11 TaskTwo(); 12 //遏制计时 13 watch.Stop(); 14 Console.WriteLine($"{DateTime.Now.ToString()} 退出Main要领,执行线程:{System.Threading.Thread.CurrentThread.ManagedThreadId}"); 15 Console.WriteLine($"主线程总耗时:{watch.ElapsedMilliseconds}ms"); 16 Console.ReadKey(); 17 } 18 19 /// <summary> 20 /// 任务一 21 /// </summary> 22 static void TaskOne() 23 { 24 Console.WriteLine($"{DateTime.Now.ToString()} 进入TaskOne要领,执行线程:{System.Threading.Thread.CurrentThread.ManagedThreadId}"); 25 for (int i = 0; i < 5; i++) 26 { 27 Console.WriteLine($"{DateTime.Now.ToString()} TaskOne正在执行,执行线程:{System.Threading.Thread.CurrentThread.ManagedThreadId}"); 28 System.Threading.Thread.Sleep(1000); 29 } 30 Console.WriteLine($"{DateTime.Now.ToString()} 退出TaskOne要领,执行线程:{System.Threading.Thread.CurrentThread.ManagedThreadId}"); 31 } 32 /// <summary> 33 /// 任务二 34 /// </summary> 35 static void TaskTwo(){ 36 Console.WriteLine($"{DateTime.Now.ToString()} 进入TaskTwo要领,执行线程:{System.Threading.Thread.CurrentThread.ManagedThreadId}"); 37 for (int i = 0; i < 2; i++) 38 { 39 Console.WriteLine($"{DateTime.Now.ToString()} TaskTwo正在执行,执行线程:{System.Threading.Thread.CurrentThread.ManagedThreadId}"); 40 System.Threading.Thread.Sleep(1000); 41 } 42 Console.WriteLine($"{DateTime.Now.ToString()} 退出TaskTwo要领,执行线程:{System.Threading.Thread.CurrentThread.ManagedThreadId}"); 43 }
这个栗子很简单,界说了两个要领:TaskOne,TaskTwo。在里面每隔一秒输出一次当前时间,和当前线程。TaskOne循环5次和TaskOne2次。然后在MAIN函数里面挨次挪用,并记录MAIN函数执行的总耗不时间。F5运行效果如图:
从图中可以看出,措施挨次执行TaskOne之后,再执行TaskTwo。执行线程未转变。
下面我们改改代码,用异步方法改写下TaskOne。提到异步,大家脑海里随之表现的我想会是它吧。关键字async。固然与之成对呈现的await也不能少了。先看看改写后的代码:
/// <summary> /// 任务一(异步) /// </summary> /// <returns></returns> static async Task<int> TaskOneAsync() { Console.WriteLine($"{DateTime.Now.ToString()} 进入TaskOneAsync要领,执行线程:{System.Threading.Thread.CurrentThread.ManagedThreadId}"); var t = Task<int>.Run(() => { var total = 0; for (int i = 0; i < 5; i++) { total++; Console.WriteLine($"{DateTime.Now.ToString()} TaskOneAsync正在执行,执行线程:{System.Threading.Thread.CurrentThread.ManagedThreadId}"); System.Threading.Thread.Sleep(1000); } return total; }); Console.WriteLine($"{DateTime.Now.ToString()} 退出TaskOneAsync要领,执行线程:{System.Threading.Thread.CurrentThread.ManagedThreadId}"); return await t; }
main函数改为挪用异步要领