#region 同步 WEB 请求
/*
* 有点像 jQuery 的思路,当他调用其他方法是当前方法会被阻塞,知道I/O 操作结束。异步工作进行期间,线程就被白白浪费了。
* 就相当于 原本有三个人,但却只用到了一个人,并且让这一个人去做一系列的事,但他只能一件一件地去做,
* 在做这件事的时候,其他的任务就阻塞了,原本有三个人,却只让一个人去做,这不就白白浪费了资源了吗?
*
* 用 try/catch 描述控制流 ,给一个 WebRequest 让后调用GetResponse ()方法下载页面 利用 GetResponseStream () 方法读取网页信息
* 并将信息赋值给 reader 然后调用 ReadToEnd 读取流 然后在判断网页的大小并打印。
*/
//public class Program
//{
//public static Stopwatch k = new Stopwatch();
// public static void Main(string[] args)
// {
// string url = "https://docs.microsoft.com/en-us/dotnet/api/system.net.webrequest.getresponse?view=netframework-4.8#System_Net_WebRequest_GetResponse";//要访问的网页
// if (args.Length > 0)
// {
// url = args[0];
// }
// k.Start();
// try
// {
// Console.WriteLine(url);
// WebRequest webRequest = WebRequest.Create(url);
// //WebRequest 向统一资源标识符(URI)发出请求。发出请求
// //Create(url)访问网页
// WebResponse response = webRequest.GetResponse();
// //WebResponse 提供来自统一资源标识符(URI)的响应。 响应网页
// // GetResponse 包含对Internet请求的响应的WebResponse。 下载网页
// Console.WriteLine(".......");
// // StreamReader 从特定编码的字节流中读取字符的TextReader。
// //GetResponseStream 用于从Internet(英特网)资源中读取数据。GetResponseStream ,对网页进行流的访问
// using (StreamReader reader = new StreamReader(response.GetResponseStream()))
// {
// string text = reader.ReadToEnd();
// //流的其余部分作为字符串,从当前位置到结束。如果当前位置位于流的末尾,则返回一个空字符串
// Console.WriteLine(
// FormatBytes(text.Length));
// }
// }
// catch (WebException)//通过可插拔协议访问网络时发生错误时引发的异常。
// {
// throw;
// }
// catch (IOException)//发生I/O错误时引发的异常。
// {
// throw;
// }
// catch (NotSupportedException)
// //当调用的方法不受支持时,或当试图读取、查找或写入不支持所调用功能的流时引发的异常。
// {
// throw;
// }
// k.Stop();
// Console.WriteLine("{0}毫秒",k.ElapsedMilliseconds);
// }
// static public string FormatBytes(long bytes)
// {
// string[] manitudes = new string[] { "GB", "MB", "KB", "Bytes" };
// long max = (long)Math.Pow(1024, manitudes.Length);//设置容量
// return string.Format("{1:##.##} {0}",//用字符串表示形式替换格式项的格式的副本即arg0和arg1。
// // public static String Format(String format, object arg0, object arg1);
// manitudes.FirstOrDefault(
// //FirstOrDefault 取序列中满足条件的第一个元素,如果没有元素满足条件,则返回默认值
// //还有一个 First 取序列中满足条件的第一个元素,如果没有元素满足条件, 抛出异常
// //linq 的方法,理解不深,回头补上
// manitude => bytes > (max /= 1024)) ?? "0 Bytes", (decimal)bytes / (decimal)max);
// //?? 是 C#2.0 中新增的运算符,可以认作三元运算符的简化版,
// // 起主要作用是 如果 ?? 运算符的左操作数非空,运算符就返回左操作符树,否则就返回右操作符数
// //相当于 if else
// }
//}
#endregion