第26章 计算限制的异步操作(1)

26.1 CLR线程池基础

可将线程池想象成可由你的应用程序使用的一个线程集合。每CLR一个线程池,每个线程由CLR控制的所有AppDomain共享。如果一个进程中加载了多个CLR,那么每个CLR都有它自己的线程池。

CLR初始化时,线程池中没有线程的。在内部,线程池维护了一个操作请求队列。应用程序想执行一个异步操作时,就调用某个方法,将一个记录项(entry)追加到线程池的队列中。线程池的代码从这个队列中提取记录项,将这个记录项派遣(dispatch)给一个线程池线程。如果线程池中没有线程,就创建一个新线程。创建线程要产生一定的性能损失。然而,当线程池线程完成任务后,线程不会被销毁。相反,线程会返回线程池,在那里进入空闲状态,等待响应另一个请求。由于线程不销毁自身,所以不再产生额外的性能损失。

如果你的应用程序向线程池发出很多请求,线程池会尝试只用这一个线程来服务所有请求。然而,如果你的应用程序发出请求的速度超过了线程池线程处理它们的速度,就会创建额外的线程。最终,你的应用程序的所有请求都能由少量线程处理,所以线程池不必创建大量线程。

如果你的应用程序停止向线程池发出请求,池中有大量什么都不做的线程。这是对内存资源的浪费。所以,当一个线程池线程闲着没事儿做有一段时间之后,线程会自己醒来终止自己以释放资源。

线程池可以只容纳少量线程;也可以容纳更多的线程,以利用多处理器,超线程处理器和多核处理器。它能在这两种不同的状态之间从容地切换。线程池是启发式的。如果应用程序需要执行很多任务,同时有可用的CPU,那么线程池会创建更多的线程。如果应用程序的负载减轻,线程池线程就终止它们自己。

在内部,线程池将自己的线程划分为工作者(Worker)线程或I/O线程。应用程序要求线程池执行一个异步的计算限制操作时,使用的就是工作者线程。I/O线程用于通知你的代码一个异步I/O限制操作已完成。具体地说,这意味着要使用“异步编程模型”(Asynchronous Programming Model,APM)发出I/O请求。

26.2 执行简单的计算限制操作

WaitCallback委托、TimerCallback委托和ParameterizedThreadStart委托是完全一致的。定义了一个和该签名匹配的方法后,使用ThreadPool.QueueUserWorkItem方法时,使用一个System.Threading.Timer对象时,或者使用一个System.Threading.Thread对象时,都可以调用这个方法。

Codes:

using System;
using System.Threading;

namespace ThreadStudy
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main thread:Queuing an asynchronous operation");
            ThreadPool.QueueUserWorkItem(Print,10);
            Console.WriteLine("Main thread:Doing other work here...");
            Thread.Sleep(5000);
            Console.WriteLine("Main thread:Executed completely...");
        }

        static void Print(object seconds)
        {
            int time = (int)seconds;
            for (int i = 0; i < time; i++)
            {
                Console.WriteLine("Here is running thread1, {0}% of the thread tasks have been completed~",10*i);
                Thread.Sleep(1000);
            }
        }
    }
}
Main thread:Queuing an asynchronous operation
Main thread:Doing other work here...
Here is running thread1, 0% of the thread tasks have been completed~
Here is running thread1, 10% of the thread tasks have been completed~
Here is running thread1, 20% of the thread tasks have been completed~
Here is running thread1, 30% of the thread tasks have been completed~
Here is running thread1, 40% of the thread tasks have been completed~
Main thread:Executed completely...
Press any key to continue . . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值