• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#多线程---I/O线程实现异步请求

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、场景

利用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 }
View Code

运行结果如下:

 分析:

webrequest.BeginGetResponse(ProcessWebResponse, webrequest)的返回类型是IAsyncResult。在返回之前,会把IAsyncResult这个类型的变量中的AsyncState这个属性

用webrequest来填充,然后将IAsyncResult这个类型的变量传递给ProcessWebResponse回调,这个回调函数是运行在线程池的IO线程上的。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#快速入门指南发布时间:2022-07-13
下一篇:
C#网络编程二:SOCKET编程发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap