使用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后的方法执行完成后以通知的形式通知到当前环境,当前环境就可以获取这一方法执行的结果了。这样一来,就没有工作线程是处于一个空等待的状态的,可以更加充分的利用工作线程资源。

方式二中会使用一个池化线程来专门等待任务的完成。

以上个人理解,如有不正确,还请赐教,不胜感激!

时间: 2025-01-04 23:01:09

使用WebClient异步获取http资源的相关文章

ajaxFileUpload异步上传资源,onchange多次调用问题的解决方案

一.上传文件的做法 1 前端代码 <input id="myfiles" name="myfiles" type="file" onchange="upload();"/> <input type="button" name="btn_abc" onclick="document.getElementById('myfiles').click();"

Android开发之异步获取并下载网络资源-下载图片和下载文本内容

在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源.首先看看实例效果图:              下载图片截图                                                                                                下载文本文件内容截图 下面介绍如何来实现这样的开发: (1)从指定的URL获取对应的流 既然要获取网络资源,那么

.Net WebRequest异步请求与WebClient异步请求

很多情况下一般会使用同步方式发出请求,直到响应后再做后续的逻辑处理等,但有时候后续的逻辑处理不依赖于请求的结果或者是可以挂起等到响应后再处理,又或者是为了解决UI"假死"的现象,这时可以使用异步请求 使用WebRequest实例中的BeginGetResponse方法异步获取响应结果,其中参数callback是委托类型,state是自定义的对象,state用于保存一些信息,在callback对应的方法中可能需要用到这些信息. 下面用一个例子说明,假设需要请求url,该url对应是一张图

通过Jquery异步获取股票实时数据

最近朋友让我帮他做个异步获取数据的程序,暂时服务器什么都没有,所以我就想先拿股票数据打个框架,方便后续开发和移植等事情 代码如下: <!-- 说明:股票看盘 作者:黑桃A 时间:2014-04-14 参考: http://www.lxway.com/240649562.htm http://www.lxway.com/946486042.htm http://www.365mini.com/page/jquery_getscript.htm http://blog.csdn.net/xxjoy_

wget获取https资源

使用wget获取 https资源,缺省命令下是要使用证书,如果还未安装证书,可以选择忽略. 例如没有github.com的证书,执行如下命令 mkdir -p model cd model wget https://github.com/dmlc/web-data/raw/master/mxnet/neural-style/model/vgg19.params cd .. mkdir -p input cd input wget https://github.com/dmlc/web-data/

Swift - 异步获取网络数据封装类

使用NSURLConnection.sendAsynchronousRequest()可以采用异步获取的方式取得数据.下面通过对数据获取类进行封装,演示如何进行数据请求与接收. 1,HttpController.swift (数据获取封装类,结果处理协议) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import UIKit //自定义http协议 protocol HttpProto

获取WebBrowser全cookie 和 httpWebRequest 异步获取页面数据

获取WebBrowser全cookie [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref int pcchCookieData, int dwFlags, object lpRe

java Http消息传递之POST和GET两种方法--通过实用工具类来获取服务器资源

实现该方法需要导入一些jar包 可以去一下地址下载: http://pan.baidu.com/s/1hqrJF7m /** * 实用工具类来获取服务器资源 * * get方法传送数据 * * 1.通过path设定传送方式 * 2.创建客户端 * 3.得到输入流 * 4.读取流准备工作 * 5.读取并写入 * @throws IOException * @throws ClientProtocolException * */ 1 public static String getHttpResul

Validform和aui2.0结合使用的表单自定义验证提示和列表页异步获取数据Demo

二.添加自定义验证演示       Validform验证提示大多都是在输入框或下拉框的右边或下面.感觉就是不美观,特别是表单字段少的时候,这种在相应对象旁边的提示就没必要了,      它会给人一种不友好的感觉(只是自己的感觉).所以下面写了三种添加演示,希望大家能给出建议,以免下次用起来纠结,不知道用哪种好.        表单验证插件是我们经常使用的Validform_v5.3.2_min.js.先上添加1演示的表单验证js代码,这里我设置了点击提交按钮后才验证.其他添加演示的区别不大,详