`
coollifer
  • 浏览: 55800 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

C#线程池

    博客分类:
  • C#
 
阅读更多

 

许多应用程序使用多个线程,但这些线程经常在休眠状态中耗费大量的时间来等待事件发生。其他线程可能进入休眠状态,并且仅定期被唤醒以轮询更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每一个进程提供了一个线程池,使应用程序能够根据需要来有效地利用多个线程。一个线程监视排到线程池的若干个等待操作的状态。当一个等待操作完成时,线程池中的一个辅助线程就会执行对应的回调函数。线程池中的线程由系统进行管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间之后创建另一个辅助线程。但线程的数目永远不会超过最大值。超过最大值的其他线程可以排队,但它们要等到其他线程完成后才启动。

线程池特别适合于执行一些需要多个线程的任务。使用线程池能够优化这些任务的执行过程,从而提高吞吐量,它不仅能够使系统针对此进程优化该执行过程,而且还能够使系统针对计算机上的其他进程优化该执行过程。如果需要启动多个不同的任务,而不想分别设置每个线程的属性,则可以使用线程池。

如果应用程序需要对线程进行特定的控制,则不适合使用线程池,需要创建并管理自己的线程。不适合使用线程池的情形包括:

— 如果需要使一个任务具有特定的优先级。

— 如果具有可能会长时间运行(并因此阻塞其他任务)的任务。

— 如果需要将线程放置到单线程单元中(线程池中的线程均处于多线程单元中)。

— 如果需要用永久标识来标识和控制线程,比如想使用专用线程来中止该线程,将其挂起或按名称发现它。

System.Threading.ThreadPool类实现了线程池。ThreadPool类是一个静态类,它提供了管理线程池的一系列方法。

ThreadPool.QueueUserWorkItem方法在线程池中创建一个线程池线程来执行指定的方法(用委托WaitCallback来表示),并将该线程排入线程池的队列等待执行。QueueUserWorkItem方法的原型为:

public static Boolean QueueUserWorkItem(WaitCallback wc, Object state);

public static Boolean QueueUserWorkItem(WaitCallback wc);

这些方法将“工作项”(和可选状态数据)排列到线程池的线程中,并立即返回。工作项只是一种方法(由wc参数标识),它被调用并传递给单个参数,即状态(状态数据)。没有状态参数的QueueUserWorkItem版本将null传递给回调方法。线程池中的某些线程将调用System.Threading.WaitCallback委托表示的回调方法来处理该工作项。回调方法必须与System.Threading.WaitCallback委托类型相匹配。WaitCallback定义如下:

public delegate void WaitCallback(Object state);

调用QueueUserWorkItem时传入的Object类型参数将传递到任务过程,可以通过这种方式来向任务过程传递参数。如果任务过程需要多个参数,可以定义包含这些数据的类,并将类的实例强制转换为Object数据类型。

每个进程都有且只有一个线程池。当进程启动时,线程池并不会自动创建。当第一次将回调方法排入队列(比如调用ThreadPool.QueueUserWorkItem方法)时才会创建线程池。一个线程监视所有已排队到线程池中的任务。当某项任务完成后,线程池中的线程将执行相应的回调方法。在对一个工作项进行排队之后将无法取消它。

线程池中的线程数目仅受可用内存的限制。但是,线程池将对允许在进程中同时处于活动状态的线程数目强制实施限制(这取决于CPU的数目和其他因素)。默认情况下,每个系统处理器最多可以运行25个线程池线程。通过使用ThreadPool.GetMaxThreads和ThreadPool.SetMax Threads方法,可以获取和设置线程池的最大线程数。

即使是在所有线程都处于空闲状态时,线程池也会维持最小的可用线程数,以便队列任务可以立即启动。将终止超过此最小数目的空闲线程,以节省系统资源。默认情况下,每个处理器维持一个空闲线程。使用ThreadPool.GetMinThreads和ThreadPool.SetMinThreads方法可以获取和设置线程池所维持的空闲线程数。

下面的程序用于计算如下的函数的值:

 

// ThreadPool.cs

// 线程池示例

using System;

using System.Threading;

public class Test

{

    // 存放要计算的数值的字段

    static double number1 = -1;

    static double number2 = -1;

    public static void Main()

    {

        // 获取线程池的最大线程数和维护的最小空闲线程数

        int maxThreadNum, portThreadNum;

        int minThreadNum;

        ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);

        ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);

        Console.WriteLine("最大线程数:{0}", maxThreadNum);

        Console.WriteLine("最小空闲线程数:{0}", minThreadNum);

        // 函数变量值

        int x = 15600;

        // 启动第一个任务:计算x的8次方

        Console.WriteLine("启动第一个任务:计算{0}的8次方。", x);

        ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);

        // 启动第二个任务:计算x的8次方根

        Console.WriteLine("启动第二个任务:计算{0}的8次方根。", x);

        ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc2), x);

        // 等待,直到两个数值都完成计算

        while (number1 == -1 || number2 == -1) ;

        // 打印计算结果

        Console.WriteLine("y({0}) = {1}", x, number1 + number2);

    }

    // 启动第一个任务:计算x的8次方

    static void TaskProc1(object o)

    {

        number1 = Math.Pow(Convert.ToDouble(o), 8);

    }

    // 启动第二个任务:计算x的8次方根

    static void TaskProc2(object o)

    {

        number2 = Math.Pow(Convert.ToDouble(o), 1.0 / 8.0);

    }

}

该程序的输出结果为:

最大线程数:25

最小空闲线程数:1

启动第一个任务:计算15600的8次方。

启动第二个任务:计算15600的8次方根。

y(15600) = 3.50749278894883E+33

分享到:
评论

相关推荐

    C#线程池 所有线程运行完毕

    以上就是关于"C#线程池 所有线程运行完毕"这一主题的主要知识点。通过理解这些概念,开发者可以更好地掌握如何在C#中有效地使用线程池,实现多任务的并发执行,并确保在所有任务完成后正确地停止线程池。

    c#线程池使用demo

    C#线程池是.NET Framework中的一个核心组件,主要用于管理和调度线程,它提供了一种高效、便捷的方式来执行异步任务。线程池通过优化线程的创建和销毁过程,提高了系统的性能,避免了大量的线程并发导致的系统资源...

    最简单的C#线程池创建Demo演示代码

    本教程将通过一个简单的C#线程池Demo演示代码,来介绍如何在C#中使用线程池。 首先,线程池的核心类是`System.Threading.ThreadPool`,它提供了一系列方法用于向线程池提交任务。在我们的示例中,我们将使用`...

    C# 线程池使用示例

    下面将详细探讨C#线程池的工作原理、优势以及如何在实际项目中应用。 线程池的基本概念: 线程池是一组预先创建的线程,这些线程由操作系统维护并等待任务分配。当需要执行新的任务时,线程池会从已存在的线程中...

    自己写的C#线程池

    从易语言转型到C#感觉C#自带的线程池不够灵活(或许是自己的技术不够),所以自己写了一个线程池工作类为了配合自己的使用习惯,有兴趣的可以下载参考 代码用到的是信号处理以及队列等一些比较基础的东西,已经测试了功能...

    c#线程池应用

    ### C#线程池应用详解 #### 一、引言 在现代软件开发中,多线程编程是一项不可或缺的技术,特别是在高性能和响应性要求较高的应用中。本文将深入探讨Microsoft .NET框架中线程池的概念及其应用。我们将讨论为什么...

    xianchengchi.rar_C# 线程_C#线程池_CSharp 多线程_c#多线程_c# 多线程

    本资源“xianchengchi.rar”提供了关于C#线程池的演示程序,帮助开发者深入理解并应用线程池技术。 线程是操作系统分配CPU时间的基本单位,每个线程都有自己的执行上下文,可以独立于其他线程运行。在C#中,我们...

    c#线程池相关.zip

    在.NET框架中,C#线程池是一种管理线程资源的有效机制,它允许开发者高效地创建和调度工作线程,而无需显式管理线程的生命周期。线程池的使用可以减少系统的开销,提高系统资源利用率,尤其在处理大量短生命周期任务...

    C# 线程池的使用 高级应用

    本教程将深入探讨C#线程池的高级应用,特别适用于使用VS2005开发环境的开发者。 首先,我们需要了解线程池的基本原理。线程池是由系统维护的一个线程集合,当需要执行新任务时,它会从线程池中分配一个已准备好的...

    C#线程池的实现---thrend

    ### C#线程池的基本概念 线程池是C#中用于管理线程的一种高效机制,它允许程序在运行时动态地创建、管理和重用线程。线程池可以显著提高应用程序的性能,特别是在处理大量并发请求或执行多个短时间任务时。线程池的...

    C#线程池和文件下载服务器

    ### C#线程池与文件下载服务器实现 #### 一、线程池概念与优势 在多线程编程中,创建和销毁线程是相对昂贵的操作。为了提高系统的响应能力和性能,可以预先创建一系列线程并存储在一个池中,这就是线程池。线程池...

    C#管理线程池的类ThreadManager

    C#管理线程池的类 /* How to use Thread Classs * * ============== * public ELMService() { InitializeComponent(); etm.ClalThreadPool("EmailThreads", (uint)ApplicationInfo.EmailParsingThreads); ...

    关于C#线程池的例子

    ### C#线程池应用详解 #### 一、引言 在现代软件开发中,特别是在网络编程领域,高效地利用系统资源是至关重要的。多线程技术为提高程序的并发性和响应性提供了强大的支持。本篇文章将通过一个具体的案例——使用...

    C#判断线程池中所有的线程是否已经完成

    在C#编程中,线程池(ThreadPool)是一种管理线程资源的有效机制,它能够高效地复用线程,减少创建和销毁线程的开销。线程池中的线程通常用于执行异步任务,因此在某些场景下,我们需要判断线程池中所有的线程是否...

    c#线程池详解

    C#线程池是.NET Framework中的一个重要组成部分,它是一种高效的线程管理机制,用于执行大量短期任务。线程池能够优化系统资源的使用,减少线程的创建和销毁开销,提高系统的整体性能。下面我们将深入探讨C#线程池的...

    c# 线程池的管理 通过ThreadPool

    C#中的线程池是一种高效的线程管理机制,它由.NET框架提供,旨在优化系统资源的使用,提高多线程程序的性能。线程池管理是程序员在编写高性能并发应用程序时必须掌握的关键技术之一。 线程池的工作原理是预先创建一...

    C# .net智能线程池 SmartThreadPool

    C# .NET智能线程池(SmartThreadPool)是一种高效、可扩展且易用的线程池实现,由软件开发者Stefan Schmidt创建。这个库在.NET框架中提供了一个替代默认线程池(System.Threading.ThreadPool)的选择,尤其适用于...

    C#线程池实例 线程池和文件下载服务器

    在C#中可以通过System.Threading.ThreadPool类来实现,在默认情况下,ThreadPool最大可建立500个工作线程和1000个I/O线程(根据机器CPU个数和.net framework版本的不同,这些数据可能会有变化) 下载文件服务器的...

    C# 多线程 线程池 线程同步

    **线程池**是C#中的一个系统服务,由`System.Threading.ThreadPool`类提供。线程池管理一组预创建的线程,当有任务需要执行时,它会从池中分配线程而不是每次都创建新的。这降低了线程创建和销毁的开销,提高了效率...

Global site tag (gtag.js) - Google Analytics