首页 > 代码库 > 使用async 和 await方法来
使用async 和 await方法来
先看直接的代码请求方式地啊;
这里是我们同步方法的实现:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 { class Program { private static readonly Stopwatch Watch = new Stopwatch(); static void Main(string[] args) { Watch.Start(); const string url1 = "http://www.cnblogs.com/"; const string url2 = "http://www.cnblogs.com/liqingwen/"; var result1 = CountCharacters(1, url1); var result2 = CountCharacters(2, url2); // 三次调用 ExtraOperation 方法(主要是通过拼接字符串达到耗时操作) for (var i = 0; i < 3; i++) { ExtraOperation(i + 1); //模拟主线程执行一些耗时的各种操作地啊; } //控制台输出 Console.WriteLine($"{url1} 的字符个数:{result1}"); Console.WriteLine($"{url2} 的字符个数:{result2}"); Console.WriteLine($"总共耗时: {Watch.ElapsedMilliseconds} ms"); Console.ReadLine(); } private static int CountCharacters(int id,string address) { var client = new WebClient(); Console.WriteLine($"开始调用 id={id} : {Watch.ElapsedMilliseconds} ms"); var result = client.DownloadString(address); Console.WriteLine($"调用完成 id={id} : {Watch.ElapsedMilliseconds} ms"); return result.Length; } private static void ExtraOperation(int id) { //这里是通过拼接字符串进行一些相对耗时的操作 var s = ""; for (var i = 0; i < 6000; i++) { s += i; } Console.WriteLine($"id = {id} 的 ExtraOperation 方法完成:{Watch.ElapsedMilliseconds} ms"); } } }
结果:有误差;
接着配合我们的aync 和 我们 await 方式来进行。。。
private static readonly Stopwatch Watch = new Stopwatch(); static void Main(string[] args) { Watch.Start(); const string url1 = "http://www.cnblogs.com/"; const string url2 = "http://www.cnblogs.com/liqingwen/"; //两次调用 CountCharactersAsync 方法(异步下载某网站内容,并统计字符的个数) Task<int> t1 = CountCharacters(1, url1); Task<int> t2 = CountCharacters(2, url2); // 三次调用 ExtraOperation 方法(主要是通过拼接字符串达到耗时操作) for (var i = 0; i < 3; i++) { ExtraOperation(i + 1); //模拟主线程执行一些耗时的各种操作地啊; } //控制台输出 Console.WriteLine($"{url1} 的字符个数:{t1.Result}"); Console.WriteLine($"{url2} 的字符个数:{t2.Result}"); Console.WriteLine($"总共耗时: {Watch.ElapsedMilliseconds} ms"); Console.ReadLine(); } private static async Task<int> CountCharacters(int id,string address) { var client = new WebClient(); Console.WriteLine($"开始调用 id={id} : {Watch.ElapsedMilliseconds} ms"); var result = await client.DownloadStringTaskAsync(address); Console.WriteLine($"调用完成 id={id} : {Watch.ElapsedMilliseconds} ms"); return result.Length; } private static void ExtraOperation(int id) { //这里是通过拼接字符串进行一些相对耗时的操作 var s = ""; for (var i = 0; i < 6000; i++) { s += i; } Console.WriteLine($"id = {id} 的 ExtraOperation 方法完成:{Watch.ElapsedMilliseconds} ms"); }
结果,有误差:
没有把必要花费在等待外部资源的请求的等待中,我们可让一其异步,然后执行我们的主线程的任务;
关于异步,多线程的几个尝试;
1. 一口一口的吃蛋糕和将蛋糕切成几份来吃没有区别;反而在切蛋糕会浪费不少的时间地呀;
2.线程初始化的时候,记住主线程的速度比子线程快,
3.本例子中使用了webclient,发送http请求,没有必要一直等待请求响应,所以主线程的做点其他的事情;
关于异步编程,还在继续进行中...........
使用async 和 await方法来
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。