C#多线程---I/O线程实现异步请求
一、场景
利用I/O线程来模拟浏览器对服务器请求的异步操作。
二、例子
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Net;
5 using System.Text;
6 using System.Threading;
7 using System.Threading.Tasks;
8
9 namespace IOThread
10 {
11 class Program
12 {
13 static void Main(string[] args)
14 {
15 Console.ForegroundColor = ConsoleColor.DarkGreen;
16 PrintThreadInfo("Print info in Main");
17 Console.ResetColor();
18 Console.WriteLine();
19
20 // 发出一个异步Web请求
21 WebRequest webrequest = WebRequest.Create("http://www.cnblogs.com/");
22 webrequest.BeginGetResponse(ProcessWebResponse, webrequest);
23 Console.WriteLine("");
24
25 Console.Read();
26 }
27 // 回调方法
28 private static void ProcessWebResponse(IAsyncResult result)
29 {
30 Thread.Sleep(500);
31 PrintThreadInfo("ProcessWebResponse Method start");
32
33 WebRequest webrequest = (WebRequest)result.AsyncState;
34 using (WebResponse webresponse = webrequest.EndGetResponse(result))
35 {
36 Console.WriteLine("Content Length is : " + webresponse.ContentLength);
37 }
38 }
39 private static void PrintThreadInfo(string info)
40 {
41 Console.WriteLine(info);
42 Console.WriteLine($"ThreadId:{Thread.CurrentThread.ManagedThreadId}\nIsBackgroundThread:{Thread.CurrentThread.IsBackground}\nIsThreadPoolThread:{Thread.CurrentThread.IsThreadPoolThread}");
43 int workerThread = 0;
44 int ioThread = 0;
45 ThreadPool.GetMaxThreads(out workerThread, out ioThread);
46 Console.WriteLine($"MaxWorkerThread:{workerThread}\nMaxIoThread:{ioThread}");
47 int workerThreadAvailable = 0;
48 int ioThreadAvailable = 0;
49 ThreadPool.GetAvailableThreads(out workerThreadAvailable, out ioThreadAvailable);
50 Console.WriteLine($"AvailableWorkerThread:{workerThreadAvailable}\nAvailableIoThread:{ioThreadAvailable}");
51 }
52 }
53 }
运行结果如下:
分析:
webrequest.BeginGetResponse(ProcessWebResponse, webrequest)的返回类型是IAsyncResult。在返回之前,会把IAsyncResult这个类型的变量中的AsyncState这个属性
用webrequest来填充,然后将IAsyncResult这个类型的变量传递给ProcessWebResponse回调,这个回调函数是运行在线程池的IO线程上的。
C#多线程---I/O线程实现异步请求的更多相关文章
- 大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?
前言 博文地址:https://sourl.cn/URptix 当一个 HTTP 请求到达 Tomcat,Tomcat 将会从线程池中取出线程,然后按照如下流程处理请求: 将请求信息解析为 HttpS ...
- libcurl的封装,支持同步异步请求,支持多线程下载,支持https
最近在做一个项目,需要用到http get post等 需求分析需要做到同步和异步,异步请求的返回以可选的回调通知的方式进行. 本人以Linux为例,一步一步的来实现. 配置并且编译libcurl我以 ...
- Filter 快速开始 异步Servlet 异步请求 AsyncContext 异步线程 异步派发 过滤器拦截
[web.xml] <filter> <filter-name>normalFilter</filter-name> <filter-class>net ...
- .NET面试题解析(07)-多线程编程与线程同步
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...
- .NET面试题解析(07)-多线程编程与线程同步 (转)
http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...
- 实现在Android简单封装类似JQuery异步请求
在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作 ...
- Android简单封装类似JQuery异步请求
在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作 ...
- 多线程编程学习笔记——使用异步IO(一)
接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...
- 【多线程】-ThreadPool线程池
ThreadPool介绍: Thread类是一个静态类,所有不存在实例化构造函数操作,直接可以调用其内所存在的方法. 微软官网给出的解释: 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 ...
随机推荐
- Twain Capabilities
Paper Handling 纸操作 CAP_AUTOFEED MSG_SET为TRUE,启用Twain源的自动进纸. CAP_CLEARPAGE MSG_SET为TRUE,退出当前页面并清空数据. ...
- ajax和springmvc的请求响应原理——深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法
1,四大重要部分: 请求链接 post请求和get请求 请求参数形式 响应内容形式 2,从springmvc的controller角度,controller能接收到请求的前提 请求链接必须对应 pos ...
- Python+Request库+第三方平台实现验证码识别示例
1.登录时经常的出现验证码,此次结合Python+Request+第三方验证码识别平台(超级鹰识别平台) 2.首先到超级鹰平台下载对应语言的识别码封装,超级鹰平台:http://www.chaojiy ...
- 如何使用Scala的ClassTag
Scala官方文档中对于ClassTag的定义如下: ClassTag[T]保存着在运行时被JVM擦除的类型T的信息.当我们在运行时想获得被实例化的Array的类型信息的时候,这个特性会比较有用. 下 ...
- 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【三】
软件定时器:是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数值后会触发用户定义的回调函数.定时精度与系统Tick时钟的周期有关. 定时器运行机制: cmsis_os2的A ...
- 性能测试之查看cpu命令
top -m 用户空间进程(us). 内核空间进程(sy). 高nice值的用户空间进程(ni). 空闲(id). 空闲等待io(wa). 中断上半部(hi). 中断下半部(si). 以及steal时 ...
- 货币兑换问题(贪心法)——Python实现
# 贪心算法求解货币兑换问题 # 货币系统有 n 种硬币,面值为 v1,v2,v3...vn,其中 v1=1,使用总值money与之兑换,求如何使硬币的数目最少,即 x1,x2,x3...xn 之 ...
- Spring Boot Mail通过QQ邮箱发送邮件
本文将介绍如何在Spring Boot工程完成QQ邮箱配置,实现邮件发送功能. 一.在pom文件中添加依赖 <dependency> <groupId>org.springfr ...
- jvm源码解读--09 创建oop对象,将static静态变量放置在oop的96 offset处 第二篇
先打断点systemDictionary.cpp 1915行 Universe::fixup_mirrors(CHECK); 进入 void Universe::fixup_mirrors(TRAPS ...
- maven 与profile,resources,properties 关系
top 的 pom.xml 看<profiles>的标签 <profiles> <!--dat环境--> <profile> <id>DAT ...