zoukankan      html  css  js  c++  java
  • 使用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后的方法执行完成后以通知的形式通知到当前环境,当前环境就可以获取这一方法执行的结果了。这样一来,就没有工作线程是处于一个空等待的状态的,可以更加充分的利用工作线程资源。
     
    方式二中会使用一个池化线程来专门等待任务的完成。
     
    以上个人理解,如有不正确,还请赐教,不胜感激!
     
     
    在asp.net mvc中有问题,原因见:http://www.cnblogs.com/bnbqian/p/4513192.html
  • 相关阅读:
    浏览器图片渲染优化教程
    C#把 DataTable转换为Model实体
    .NET静态变量与静态方法并发的问题
    三种方法查看MySQL数据库的版本
    Mysql 存储引擎 InnoDB与Myisam的主要区别
    dotnet core 出现Can not find runtime target for framework '.NETCoreApp,Version=v1.6' 的解决办法
    细说 C# 中的 IEnumerable和IEnumerator接口
    ASP.NET CORE dotnet run 命令使用debug方式运行
    安装了插件情况下 强制开启火狐浏览器的多进程功能
    JSON 字符串中的中括号和大括号区别详解
  • 原文地址:https://www.cnblogs.com/lihan829/p/5352181.html
Copyright © 2011-2022 走看看