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

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

  • 相关阅读:
    四则运算2
    进度条博客
    随机生成30道100以内的四则运算题
    构建之法阅读笔记01
    自我介绍
    c# dataGridView cell添加下拉框
    Winform Combobox.Items tooltip
    中医和红外(北京第一个工作)
    pdf修复
    c# 导出数据到excel
  • 原文地址:https://www.cnblogs.com/mc67/p/6256596.html
Copyright © 2011-2022 走看看