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

C#中的ThreadStart委托

ThreadStart 委托
ThreadStart 是 .NET 中的一个内置委托类型,表示无参数且无返回值的方法。其定义如下:

public delegate void ThreadStart();
  • 通常用于定义线程的入口方法。

  • List<ThreadStart>
    这是一个泛型集合,用于存储多个 ThreadStart 委托实例。每个委托代表一个待执行的任务。

  • 整体作用
    创建一个线程任务队列,用于保存需要通过线程执行的多个方法。

2. 典型使用场景

private List<ThreadStart> delegates = new List<ThreadStart>();
(1) 多任务队列管理
// 添加任务到队列
delegates.Add(() => Console.WriteLine("Task 1"));
delegates.Add(() => File.WriteAllText("test.txt", "Hello"));// 启动线程执行所有任务
foreach (var task in delegates)
{new Thread(task).Start();
}

(2) 延迟执行控制

 

// 先收集任务
delegates.Add(() => DownloadFile(url1));
delegates.Add(() => ProcessData(data));// 在适当时候触发执行
void ExecuteAllTasks()
{foreach (var task in delegates){new Thread(task).Start();}
}

3. 技术细节

委托与线程的关系
  • 每个 ThreadStart 委托可以传递给 Thread 构造函数,作为线程启动时执行的方法。

  • 示例:

ThreadStart task = () => Console.WriteLine("Running in thread");
Thread thread = new Thread(task);
thread.Start();
线程安全注意事项
  • 非线程安全集合
    List<T> 本身不是线程安全的。若多线程同时修改集合(如添加/删除任务),需加锁:

private readonly object _lock = new object();void AddTask(ThreadStart task)
{lock (_lock){delegates.Add(task);}
}

 4. 完整使用示例

using System;
using System.Collections.Generic;
using System.Threading;class TaskScheduler
{private List<ThreadStart> _tasks = new List<ThreadStart>();private readonly object _lock = new object();public void AddTask(Action action){lock (_lock){_tasks.Add(new ThreadStart(action));}}public void ExecuteAll(){List<Thread> threads = new List<Thread>();lock (_lock){foreach (var task in _tasks){Thread thread = new Thread(task);threads.Add(thread);thread.Start();}_tasks.Clear();}// 等待所有线程完成(可选)foreach (var thread in threads){thread.Join();}}
}// 使用示例
var scheduler = new TaskScheduler();
scheduler.AddTask(() => Console.WriteLine("Task 1"));
scheduler.AddTask(() => Thread.Sleep(1000));
scheduler.ExecuteAll();

 

5. 替代方案(现代C#推荐)

使用 Task 和 ConcurrentQueue
using System.Collections.Concurrent;
using System.Threading.Tasks;private ConcurrentQueue<Action> _taskQueue = new ConcurrentQueue<Action>();// 添加任务
_taskQueue.Enqueue(() => Console.WriteLine("Task 1"));// 并行执行
Parallel.ForEach(_taskQueue, task => task.Invoke());
_taskQueue.Clear();
优点
  • 更高效的线程池管理(通过 Task

  • 天生线程安全的集合(ConcurrentQueue

  • 支持 async/await


6. 关键区别:ThreadStart vs Action

特性ThreadStartAction
返回值无 (void)无 (void)
参数可带参数(如 Action<int>
用途专用于 Thread 构造函数通用委托
现代性较旧 API推荐使用

总结

  • 原始代码:创建了一个传统的线程任务队列,适用于需要显式管理 Thread 的场景。

  • 现代替代:推荐使用 Task + ConcurrentQueue 组合,更符合当前 .NET 的并发编程最佳实践。

  • 线程安全:若坚持使用 List<ThreadStart>,必须通过锁机制保证线程安全。

根据实际需求选择合适方案,平衡控制精细度和开发效率。

 

相关文章:

  • 代理IP高可用性与稳定性方案:负载均衡、节点健康监测与智能切换策略
  • LLaMA-Factory:了解webUI参数
  • 【hive】hive内存dump导出hprof文件
  • 虚幻引擎5-Unreal Engine笔记之什么时候新建GameMode,什么时候新建关卡?
  • solidity智能合约-知识点
  • 开源音视频转文字工具:基于 Vosk 和 Whisper 的多语言语音识别项目
  • B/S架构和C/S架构的介绍与分析
  • 如何在LVGL之外的线程更新UI内容
  • 从纸质契约到智能契约:AI如何改写信任规则与商业效率?​——从智能合约到监管科技,一场颠覆传统商业逻辑的技术革命
  • Unreal 从入门到精通之SceneCaptureComponent2D实现UI层3D物体360°预览
  • 学习VS2022离线安装包的下载方法
  • STC-ISP烧录过程中一直显示“正在检测单片机”的解决办法
  • WebSphere Application Server(WAS)8.5.5教程第五讲
  • 解释加密中的加盐操作
  • 理解PostgreSQL查询执行计划(三)--复杂操作篇
  • C++17之std::launder函数
  • 【回溯法】0-1背包问题 C/C++(附代码)
  • nmcli connection reload
  • React集成百度【JSAPI Three】教程(002):设置不同的环境效果
  • OpenTelemetry 从入门到精通
  • 习近平:坚持科学决策民主决策依法决策,高质量完成“十五五”规划编制工作
  • AI创业者聊大模型应用趋势:可用性和用户需求是关键
  • 媒体评教师拎起学生威胁要扔下三楼:师风师德不能“悬空”
  • 大风+暴雨,中央气象台双预警齐发
  • 浙江一家长称小学老师打孩子还威胁要从3楼扔下,当地警方已立案
  • 一条铺过11年时光的科学红毯,丈量上海科创的“长宽高”