在.NET Core中使用异步编程的方法步骤(2)

static int Method1() { Thread.Sleep(200); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:我计算了一个值耗费200ms"); return 1; } static int Method200ms() { Thread.Sleep(200); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:我做了一件耗费200ms的事情"); return 200; } static int Method500ms(int index) { Thread.Sleep(500); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:我做了一件耗费500ms的事情"); return ++index; } static int Method1000ms() { Thread.Sleep(1000); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:我做了一件耗费1000ms的事情"); return 1000; }

Method500ms()需要Method1()的返回值作为参数,如果所有的方法同步执行在最后计算a、b、c、d的和:

static void Main(string[] args) { Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:开始"); var a = Method1(); var b = Method200ms(); var c = Method500ms(a); var d = Method1000ms(); var result = a+b+c+d; Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:最后得到的结果{result}"); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:结束"); Console.ReadKey(); }

控制台打印:

2019-03-26 15:10:06 106:开始
2019-03-26 15:10:06 106:我计算了一个值耗费200ms
2019-03-26 15:10:06 106:我做了一件耗费200ms的事情
2019-03-26 15:10:07 107:我做了一件耗费500ms的事情
2019-03-26 15:10:08 108:我做了一件耗费1000ms的事情
2019-03-26 15:10:08 108:最后得到的结果1203
2019-03-26 15:10:08 108:结束

同步执行的时候,需要逐一等待所有的方法执行完成,花费的时间显然是所有的方法耗费的时间之和。

在.NET Core中使用异步编程的方法步骤

对于以上四个方法,如果使用异步的方式来执行,将会很大程度的节省程序的运行时间,修改方法如下:

static async Task<int> AsyncMethod1() { await Task.Run(()=> { Thread.Sleep(200); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:我计算了一个值耗费200ms"); }); return 1; } static async Task<int> AsyncMethod200ms() { await Task.Run(() => { Thread.Sleep(200); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:我做了一件耗费200ms的事情"); }); return 200; } static async Task<int> AsyncMethod500ms(int index) { await Task.Run(() => { Thread.Sleep(500); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:我做了一件耗费500ms的事情"); }); return ++index; } static async Task<int> AsyncMethod1000ms() { await Task.Run(() => { Thread.Sleep(1000); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:我做了一件耗费1000ms的事情"); }); return 1000; }

使用异步的方式来调用方法:

static void Main(string[] args) { Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:开始"); var m1 = AsyncMethod1(); var m2 = AsyncMethod200ms(); var m4 = AsyncMethod1000ms(); m1.Wait(); var m3 = AsyncMethod500ms(m1.Result); m2.Wait(); m3.Wait(); m4.Wait(); var result = m1.Result + m2.Result + m3.Result + m4.Result; Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:最后得到的结果{result}"); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:结束"); Console.ReadKey(); }

控制台打印:

2019-03-26 14:11:54 1154:开始
2019-03-26 14:11:54 1154:我计算了一个值耗费200ms
2019-03-26 14:11:54 1154:我做了一件耗费200ms的事情
2019-03-26 14:11:55 1155:我做了一件耗费500ms的事情
2019-03-26 14:11:55 1155:我做了一件耗费1000ms的事情
2019-03-26 14:11:55 1155:最后得到的结果1203
2019-03-26 14:11:55 1155:结束

因为 AsyncMethod500ms() 依赖于 AsyncMethod1() 的返回结果作为参数,所以我们可以先直接以异步的方式运行 AsyncMethod1() , AsyncMethod200ms() , AsyncMethod1000ms() 三个方法,这个时候三个方法都会建立异步的子线程进行执行,但是后面的 AsyncMethod500ms() 想要执行,必须的有 AsyncMethod1() 的返回值,所以这个时候对 AsyncMethod1() 进行等待, 200ms 后, AsyncMethod1() 执行完成, m1.Wait() 等待结束,继续执行 AsyncMethod500ms() ,并传入了 AsyncMethod1() 的返回值 m1.Result ,最后因为需要对四个方法的返回值进行累加,所以在这之前必须保证其它三个方法也执行完成,所以需要分别对 AsyncMethod500ms() , AsyncMethod200ms() , AsyncMethod1000ms() 进行等待(Wait),因为此刻所有的方法都是异步执行的,所以程序的执行时间将≈执行时间最长的那个方法的执行时间( AsyncMethod1000ms() 执行 1000ms ,执行时间最长,程序的执行时间≈ 1000ms )。

在.NET Core中使用异步编程的方法步骤

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsgxw.html