C#线程处理系列之线程池中的I/O线程

2019-12-30 12:04:03于海丽

二、I/O线程实现对请求的异步

我们同样可以利用I/O线程来模拟对浏览器对服务器请求的异步操作,在.net类库中的WebRequest类提供了异步请求的支持,

下面就来演示下如何实现请求异步:


using System;
using System.Net;
using System.Threading;

namespace RequestSample
{
  class Program
  {
    static void Main(string[] args)
    {
      ThreadPool.SetMaxThreads(1000, 1000);
      PrintMessage("Main Thread start");

      // 发出一个异步Web请求
      WebRequest webrequest =WebRequest.Create("http://www.easck.com/");
      webrequest.BeginGetResponse(ProcessWebResponse, webrequest);

      Console.Read();
    }

    // 回调方法
    private static void ProcessWebResponse(IAsyncResult result)
    {
      Thread.Sleep(500);
      PrintMessage("Asynchronous Method start");

      WebRequest webrequest = (WebRequest)result.AsyncState;
      using (WebResponse webresponse = webrequest.EndGetResponse(result))
      {      
        Console.WriteLine("Content Length is : "+webresponse.ContentLength);
      }
    }

    // 打印线程池信息
    private static void PrintMessage(String data)
    {
      int workthreadnumber;
      int iothreadnumber;

      // 获得线程池中可用的线程,把获得的可用工作者线程数量赋给workthreadnumber变量
      // 获得的可用I/O线程数量给iothreadnumber变量
      ThreadPool.GetAvailableThreads(out workthreadnumber, out iothreadnumber);

      Console.WriteLine("{0}n CurrentThreadId is {1}n CurrentThread is background :{2}n WorkerThreadNumber is:{3}n IOThreadNumbers is: {4}n",
        data,
        Thread.CurrentThread.ManagedThreadId,
        Thread.CurrentThread.IsBackground.ToString(),
        workthreadnumber.ToString(),
        iothreadnumber.ToString());
    }
  }
}

运行结果为:

 C#,线程处理,线程池,I/O线程

写到这里这篇关于I/O线程的文章也差不多写完了, 其实I/O线程还可以做很多事情,在网络(Socket)编程,web开发中都会用I/O线程,本来想写个Demo来展示多线程在实际的工作中都有那些应用的地方的, 但是后面觉得还是等多线程系列都讲完后再把知识一起串联起来做个Demo会好点,至于后面文章中将介绍下线程同步的问题。



注:相关教程知识阅读请移步到c#教程频道。