异步编程练习

原始代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
using System.Net;
namespace ConsoleApp1
{
    class MyDownloadString
    {
        Stopwatch sw = new Stopwatch();
        public void DoRun()
        {
            const int LargeNumber = 6000000;
            sw.Start();    //秒表开始记时
            int t1 = CountCharacters(1, "http://www.163.com");    //调用方法,结束时读取秒表时间
            int t2 = CountCharacters(2, "http://www.baidu.com");
            CountToALargerNumber(1, LargeNumber); //调用4次方法;每次结束时,读取秒表时间
            CountToALargerNumber(2, LargeNumber);
            CountToALargerNumber(3, LargeNumber);
            CountToALargerNumber(4, LargeNumber);
            Console.WriteLine("Chars in www.163.com is {0}",t1);
            Console.WriteLine("Chars in www.baidu.com is "+t2  );
        }
        private int CountCharacters(int id,string uriString)
        {
            WebClient wc1 = new WebClient();
            Console.WriteLine("Starting call    {0}:   {1} ms",id,sw.Elapsed.TotalMilliseconds);
            string result = wc1.DownloadString(new Uri(uriString));
            Console.WriteLine("Call {0} completed:    {1} ms   ", id, sw.Elapsed.TotalMilliseconds);
            return result.Length;
        }
        private void CountToALargerNumber(int id, int value)
        {
            for (long i = 0; i < value; i++) ;
            Console.WriteLine("Endcounting    {0}:    {1} ms    ",id,sw.Elapsed.TotalMilliseconds);
           
        }
    }
    class Program
    {
 
        static void Main(string[] args)
        {
            MyDownloadString ds = new MyDownloadString();
            ds.DoRun();
            Console.ReadKey();
        }
    }
}
-------------------------------------------------------
使用异步之后
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
using System.Net;
using System.Threading.Tasks;
namespace ConsoleApp1
{
    class MyDownloadString
    {
        Stopwatch sw = new Stopwatch();
        public void DoRun()
        {
            const int LargeNumber = 6000000;
            sw.Start();    //秒表开始记时
           Task< int> t1 = CountCharacters(1, "http://www.163.com");    //Task<int> 类型占位符对象,计划进行的工作,并且最终将返回int; 开始之后会立即执行下面的代码;
            Task<int> t2 = CountCharacters(2, "http://www.baidu.com");// 在上一个方法计算过程中,这一个过程也立即开始了。
            CountToALargerNumber(1, LargeNumber); //调用4次方法;每次结束时,读取秒表时间
            CountToALargerNumber(2, LargeNumber);
            CountToALargerNumber(3, LargeNumber);
            CountToALargerNumber(4, LargeNumber);
            Console.WriteLine("Chars in www.163.com is {0}",t1.Result);//从CountCharacters中获取结果后,显示,如果没有回应,会继等待
            Console.WriteLine("Chars in www.baidu.com is "+t2.Result );
        }
        private async Task<int> CountCharacters(int id,string uriString)
        {
            WebClient wc1 = new WebClient();
            Console.WriteLine("Starting call    {0}:   {1} ms",id,sw.Elapsed.TotalMilliseconds);
            string result =await wc1.DownloadStringTaskAsync(new Uri(uriString));  //此处await, 代表此代码是可以等待的;await 用来指定哪些方法是可以异步的
            Console.WriteLine("Call {0} completed:    {1} ms   ", id, sw.Elapsed.TotalMilliseconds);
            return result.Length;
        }
        private void CountToALargerNumber(int id, int value)
        {
            for (long i = 0; i < value; i++) ;
            Console.WriteLine("Endcounting    {0}:    {1} ms    ",id,sw.Elapsed.TotalMilliseconds);
           
        }
    }
    class Program
    {
 
        static void Main(string[] args)
        {
            MyDownloadString ds = new MyDownloadString();
            ds.DoRun();
            Console.ReadKey();
        }
    }
}
posted @ 2020-06-11 21:59  小白沙  阅读(136)  评论(0编辑  收藏  举报