標籤:console extra 沒有 .com 相對 namespace image cti http
先看直接的代碼請求方式地啊;
這裡是我們同步方法的實現:
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方法來