使用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请求,没有必要一直等待请求响应,所以主线程的做点其他的事情;

关于异步编程,还在继续进行中...........

原文地址:https://www.cnblogs.com/mc67/p/6256596.html