【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 示例代码:

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 示例代码:

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 示例代码: 

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 示例代码:

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

 

### C# 中线程池的使用方法与实例 #### 实现 `QueueUserWorkItem` 方法以符合 .NET 线程池标准 为了使自定义线程池能够兼容 .NET 的线程池接口,应当实现 `QueueUserWorkItem` 方法。此方法允许向线程池提交工作项以便异步执行[^1]。 ```csharp public class CustomThreadPool : IDisposable { private readonly Queue<WaitCallback> _workItems = new(); private volatile bool _disposed; public void QueueUserWorkItem(WaitCallback callback) { lock (_workItems) { if (callback != null && !_disposed) _workItems.Enqueue(callback); } } // Other members... } ``` #### 动态调整线程数量并设置上下限 创建可实例化的线程池对象而非依赖静态成员来管理线程生命周期非常重要。这使得可以更精细地控制资源分配给特定用途,并且可以根据负载情况动态增加或减少活动线程的数量,在一定范围内保持性能最优。 ```csharp private int _minThreads; private int _maxThreads; private int _currentThreadCount; // Constructor or configuration method sets these values appropriately. ``` #### 跟踪正在使用的线程数以及等待的任务队列长度 维护三个计数器分别记录当前活跃的工作线程数目 (`WorkerThreads`)、正忙于处理任务的线程数目 (`InUseThreads`) 和待处理回调函数的数量 (`WaitingCallbacks`) 是必要的,这样可以帮助监控系统的健康状态并做出相应的优化决策[^2]。 ```csharp public struct ThreadStatistics { public int WorkerThreads { get; set; } // Current active threads count public int InUseThreads { get; set; } // Busy processing tasks public int WaitingCallbacks { get; set; } // Pending work items queue length } /// <summary> /// Method to retrieve statistics about the thread pool status. /// </summary> public ThreadStatistics GetPoolStatus() => /* Implementation */; ``` #### 使用多线程提高应用程序响应性和效率 .NET Framework 提供了多种机制让用户能够在不影响用户体验的前提下充分利用计算机硬件的能力,通过合理安排后台任务和前台交互逻辑之间的平衡点达到最佳效果[^4]。 ```csharp using System.Threading; class Program { static void Main(string[] args) { ThreadPool.QueueUserWorkItem(o => Console.WriteLine("This runs asynchronously.")); // Keep console app alive long enough for async operation to complete. Thread.Sleep(2000); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangnaisheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值