使用WebClient异步获取http资源

Posted 冷暖自知~~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用WebClient异步获取http资源相关的知识,希望对你有一定的参考价值。

使用WebClient异步获取http资源:
方式一、
     public static async Task<string> GetStringAsync()
        {
            //System.Console.WriteLine(Thread.CurrentThread.Name + "  是否池化线程:" + Thread.CurrentThread.IsThreadPoolThread);
            System.Console.WriteLine("GetStringAsync is start");
            var client = new WebClient();
            var result = await client.DownloadStringTaskAsync(new Uri(url));
            System.Console.WriteLine("GetStringAsync is end");
            return result;
        }

 

 
调用方式:
     static void Main(string[] args)
        {            
            Console.WriteLine("main is start");
            Thread.CurrentThread.Name = "主线程";
            Task<string> s = AsyncTest.GetStringAsync();
 
            var str=AsyncTest.GetString();
            Console.WriteLine(str);
            Console.WriteLine("main function is going to complete");
            Console.WriteLine(s.Result);
            Console.Read();
        }

 

 
原理上和直接使用一个
方式二、
Task<string> s = Task.Run(() => { return AsyncTest.GetString(); });

 

s.Result即为获取到的资源的string形式;
的方式一样,但是更有性能上的优势。
 
方式一中的DownloadStringTaskAsync方法前虽然确实有一个关键字await ,但它其实并没有新开线程去等待网络请求结束返回字符串,内部实现是程序运行到await时继续执行下一行代码,不阻塞当前线程,但是它也并不是说就重新开一个线程去等待await后的方法执行完成,而是并没有线程在等(个人理解,对于IIS来说这里是有一个IO线程在等待,从名字上也可看出一二,IO线程专门用来进行IO的。据说IIS有两种线程:1、工作线程;2、IO线程;而平常处理浏览器请求的是工作线程),而是让await后的方法执行完成后以通知的形式通知到当前环境,当前环境就可以获取这一方法执行的结果了。这样一来,就没有工作线程是处于一个空等待的状态的,可以更加充分的利用工作线程资源。
 
方式二中会使用一个池化线程来专门等待任务的完成。
 
以上个人理解,如有不正确,还请赐教,不胜感激!

以上是关于使用WebClient异步获取http资源的主要内容,如果未能解决你的问题,请参考以下文章

WebClient-Reactor风格的异步调用

WebClient 从服务器下载/获取文件方式

如何使用 Spring5 WebClient 进行异步调用

通过 HTTP 302 重定向从 WebClient 获取位置?

SpringCloud升级之路2020.0.x版-37. 实现异步的客户端封装配置管理的意义与设计

为啥WebClient