【C#】ThreadPool的使用

1.Thread的使用

Thread的使用参考:【C#】Thread的使用

2.ThreadPool的使用

.NET Framework 和 .NET Core 提供了 System.Threading.ThreadPool 类来帮助开发者以一种高效的方式管理线程。ThreadPool 是一个线程池,它能够根据需要动态地分配和回收线程,从而提高应用程序的性能。

下面是关于如何在 C# 中使用 ThreadPool 的基本示例:

1. 基本用法

要使用 ThreadPool 来执行一个方法,你可以调用 QueueUserWorkItem 方法。这个方法会将指定的工作项加入到 ThreadPool 的队列中,并由 ThreadPool 决定何时执行。

1.1 示例代码:

cs 复制代码
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // 使用匿名方法来定义工作项
        ThreadPool.QueueUserWorkItem(state => DoSomeWork(state));

        Console.WriteLine("Main thread is doing some work...");
        Console.ReadLine();
    }

    static void DoSomeWork(object state)
    {
        Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is processing {state}");
    }
}

2. 获取工作完成的通知

有时需要知道 ThreadPool 已经完成了你的任务。这可以通过向 QueueUserWorkItem 方法传递一个回调委托来实现。

2.1 示例代码:

cs 复制代码
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // 定义回调函数
        WaitCallback callback = state => DoSomeWork(state);
        
        // 注册回调函数
        ThreadPool.QueueUserWorkItem(callback, "Hello from ThreadPool");

        // 在主线程上等待一段时间,确保回调被处理
        Thread.Sleep(1000);

        Console.WriteLine("Main thread continues...");
        Console.ReadLine();
    }

    static void DoSomeWork(object state)
    {
        Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is processing {state}");
    }
}

3. 设置最大线程数

可以通过设置 ThreadPool.SetMaxThreads 方法来限制 ThreadPool 可以使用的最大线程数。

3.1 示例代码:

cs 复制代码
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        int maxWorkerThreads, maxIoCompletionThreads;
        
        // 设置最大线程数
        ThreadPool.SetMaxThreads(50, 100);

        // 获取最大线程数
        ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxIoCompletionThreads);

        Console.WriteLine($"Max Worker Threads: {maxWorkerThreads}");
        Console.WriteLine($"Max IO Completion Threads: {maxIoCompletionThreads}");

        Console.ReadLine();
    }
}

4. 获取当前可用线程数

也可以获取当前 ThreadPool 中可用的线程数量。

4.1 示例代码:

cs 复制代码
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        int availableWorkerThreads, availableIoCompletionThreads;

        // 获取当前可用线程数
        ThreadPool.GetAvailableThreads(out availableWorkerThreads, out availableIoCompletionThreads);

        Console.WriteLine($"Available Worker Threads: {availableWorkerThreads}");
        Console.WriteLine($"Available IO Completion Threads: {availableIoCompletionThreads}");

        Console.ReadLine();
    }
}

以上就是一些基本的 ThreadPool 使用示例。

5.请注意

ThreadPool 的设计是为了高效地管理和调度线程,所以它非常适合于那些可以并行执行的任务。然而,对于长时间运行的任务或者对线程控制有更严格要求的任务,可能需要考虑使用其他机制如 TaskTask Parallel Library (TPL)

3.CancellationTokenSource与Thread的启动、取消的区别

使用参考:

【C#】 CancellationTokenSource 与Thread的启动、取消的区别?-CSDN博客文章浏览阅读816次,点赞10次,收藏9次。【C#】 CancellationTokenSource 与Thread的启动、取消的区别?https://blog.csdn.net/wangnaisheng/article/details/140541192

相关推荐
A_nanda9 小时前
c# MOdbus rto读写串口,如何不相互影响
算法·c#·多线程
码云数智-园园11 小时前
使用 C# 将 PowerPoint 演示文稿高效转换为 PDF 格式
c#
PfCoder12 小时前
WinForm真入门(23)---PictureBox 控件详细用法
开发语言·windows·c#·winform
gc_229915 小时前
C#学习调用OpenMcdf模块解析ole数据的基本用法(1)
c#·ole·openmcdf
MM_MS19 小时前
Halcon图像点运算、获取直方图、直方图均衡化
图像处理·人工智能·算法·目标检测·计算机视觉·c#·视觉检测
老骥伏枥~20 小时前
C# 控制台:Console.ReadLine / WriteLine
开发语言·c#
PfCoder1 天前
C#中定时器之System.Timers.Timer
c#·.net·visual studio·winform
人工智能AI技术2 天前
【C#程序员入门AI】本地大模型落地:用Ollama+C#在本地运行Llama 3/Phi-3,无需云端
人工智能·c#
MyBFuture2 天前
C#数组详解:一维二维与交错数组
开发语言·windows·c#·visual studio·vision pro