当前位置: 首页 > article >正文

C#的一种多线程实现:System.Threading.ThreadPool.QueueUserWorkItem

System.Threading.ThreadPool.QueueUserWorkItem 是 C# 中用于将任务异步提交到线程池执行的方法。线程池是 .NET 提供的一个管理线程的机制,它可以有效地复用线程,避免频繁创建和销毁线程的开销。

方法说明
QueueUserWorkItem 方法有两个重载版本:

QueueUserWorkItem(WaitCallback callBack)
将任务提交到线程池,任务由 WaitCallback 委托表示。

QueueUserWorkItem(WaitCallback callBack, object? state)
将任务提交到线程池,并允许传递一个状态对象(state)作为参数。

参数
callBack:一个 WaitCallback 委托,表示要执行的任务。它的签名是:

public delegate void WaitCallback(object? state);

其中 state 是传递给任务的可选参数。

state:一个可选的对象,作为参数传递给 callBack 委托。如果不需要传递参数,可以设置为 null。

使用场景
QueueUserWorkItem 适用于需要异步执行一些短时间任务的场景。由于线程池会管理线程的复用,因此它比手动创建线程更高效。

示例代码
以下是一个简单的示例,展示如何使用 QueueUserWorkItem:

using System;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        // 将任务提交到线程池
        ThreadPool.QueueUserWorkItem(DoWork, "Hello, ThreadPool!");

        Console.WriteLine("主线程继续执行...");
        Thread.Sleep(2000); // 等待任务完成
        Console.WriteLine("主线程结束。");
    }

    static void DoWork(object state)
    {
        string message = (string)state;
        Console.WriteLine($"线程池线程开始执行: {message}");
        Thread.Sleep(1000); // 模拟任务执行
        Console.WriteLine("线程池线程执行完毕。");
    }
}

输出:

主线程继续执行...
线程池线程开始执行: Hello, ThreadPool!
线程池线程执行完毕。
主线程结束。

关键点
异步执行:任务会被线程池中的一个线程异步执行,不会阻塞主线程。

线程池管理:线程池会自动管理线程的创建和复用,适合执行短时间任务。

状态传递:可以通过 state 参数将数据传递给任务。

注意事项
不适合长时间任务:线程池的线程数量有限,长时间任务可能会占用线程池资源,影响其他任务的执行。

无返回值:QueueUserWorkItem 不支持直接获取任务的返回值。如果需要返回值,可以考虑使用 Task 或 Task<TResult>。

替代方案
在现代 C# 中,推荐使用 Task 和 Task.Run 来实现异步任务,因为它们更灵活且支持返回值、异常处理等功能。例如:

Task.Run(() => DoWork("Hello, Task!"));

Task 是基于线程池的,但提供了更高级的功能和更好的编程体验


http://www.kler.cn/a/552312.html

相关文章:

  • 【蓝桥杯集训·每日一题2025】 AcWing 6123. 哞叫时间 python
  • 在阿里云Linux主机上运行大模型deepseek r1
  • Go 模块管理工具 `go mod tidy` 和 `go.sum` 文件详解
  • Django 创建表 choices的妙用:get_<field_name>_display()
  • 【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析④】
  • python环境的yolov11.rknn物体检测
  • vscode/cursor 写注释时候出现框框解决办法
  • 深度学习论文: RailYolact -- A Yolact Focused on edge for Real-Time Rail Segmentation
  • Linux环境基础开发工具的使用(一)
  • 五档历史Level2行情数据:期货市场的信息宝库
  • 【Spring快速入门】不断更新...
  • 实现可拖拽的 Ant Design Modal 并保持下层 HTML 可操作性
  • 百度智能云—千帆 ModelBuilder API的简单调用(Java)
  • leetcode232-用栈实现队列
  • 百度搜索和文心智能体接入DeepSeek满血版——AI搜索的新纪元
  • 【网络安全 | 漏洞挖掘】我如何通过Cookie Manipulation发现主域上的关键PII?
  • [OD E 100] 服务器广播需要广播的服务器数量
  • Hive Orc表数据导出和导入
  • Param ‘serviceName‘ is illegal, serviceName is blank
  • Rabbitmq的三个端口区分