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

运行结果如下:

 分析:

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

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

转载于:https://www.cnblogs.com/3xiaolonglong/p/9645009.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,可以使用多线程实现异步加载。一种常见的方法是使用Thread类创建子线程,并在子线程中执行需要异步加载的任务。可以通过ThreadStart委托将要执行的方法与新线程对象关联起来。例如,在FrmQC111_Load方法中,可以创建一个新的线程load,并将loadpage方法与该线程关联起来。loadpage方法中使用Action委托与具体的方法Bindt进行绑定,并使用BeginInvoke方法进行异步调用。Bindt方法用于实现加载控件数据源的操作。[1] 另一种常见的方法是使用Task类来执行异步任务。在.NET 4.0及以上版本中,可以使用Task类来实现异步操作。Task类提供了一种更方便的方式来执行异步任务,并且可以提高程序的运行效率。在.NET 5.0中,还引入了async/await关键字,使得异步编程更加方便。[2] 下面是两种方法的示例代码: 使用Thread类: ```csharp private void FrmQC111_Load(object sender, EventArgs e) { Thread load = new Thread(new ThreadStart(loadpage)); load.Start(); } private void loadpage() { // 执行异步加载的操作 Bindt(); } private void Bindt() { // 实现具体的加载操作 // ... } ``` 使用Task类: ```csharp private async void FrmQC111_Load(object sender, EventArgs e) { await Task.Run(() => Bindt()); } private void Bindt() { // 实现具体的加载操作 // ... } ``` 以上是两种常见的在C#实现多线程异步加载的方法。具体选择哪种方法取决于你的需求和编程习惯。[3]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值