C#中ThreadStart委托的实现

 更新时间:2025年05月20日 09:35:32   作者:CoderIsArt  
ThreadStart是.NET中的一个内置委托类型,表示无参数且无返回值的方法,本文主要介绍了C#中ThreadStart委托的实现,具有一定的参考价值,感兴趣的可以了解一下

1.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>,必须通过锁机制保证线程安全。

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

到此这篇关于C#中ThreadStart委托的实现的文章就介绍到这了,更多相关C# ThreadStart委托内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#通过rabbitmq实现定时任务(延时队列)

    C#通过rabbitmq实现定时任务(延时队列)

    工作中经常会有定时任务的需求,常见的做法可以使用Timer、Quartz、Hangfire等组件,本文使用C#通过rabbitmq实现定时任务(延时队列),感兴趣的可以了解一下
    2021-05-05
  • Datagridview使用技巧(9)Datagridview的右键菜单

    Datagridview使用技巧(9)Datagridview的右键菜单

    这篇文章主要为大家详细介绍了Datagridview使用技巧,Datagridview的右键菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • ScriptControl控件执行自定义VBS脚本示例分析

    ScriptControl控件执行自定义VBS脚本示例分析

    这篇文章主要介绍ScriptControl控件 msscript.ocx msscript.oca执行自定义VBS脚本的示例代码,需要的朋友可以参考下
    2013-04-04
  • C#特性-对象集合初始化器介绍

    C#特性-对象集合初始化器介绍

    在写一些实体类的时候,我们往往在写构造方法的时候思考很长时间,除了一个无参构造器外还在想需要写几个构造器呢?哪些参数是需要初始化的。现在你再也不需要为这事烦恼了
    2014-12-12
  • c#中directory 和directoryinfo的使用小结

    c#中directory 和directoryinfo的使用小结

    当使用C#处理目录时,可以使用 System.IO 命名空间中的 Directory 和 DirectoryInfo 类来执行各种目录操作,本文主要介绍了c#中directory 和directoryinfo的使用小结,感兴趣的可以了解一下
    2024-02-02
  • C# 制作PictureBox圆形头像框并从数据库中读取头像

    C# 制作PictureBox圆形头像框并从数据库中读取头像

    C#提供的PictureBox控键默认情况下是方形的非常大的影响美观,怎么解决这一问题呢?下面小编给大家带来了C# 制作PictureBox圆形头像框并从数据库中读取头像的操作代码,感兴趣的朋友一起学习下吧
    2021-08-08
  • UnityShader3实现转圈与冷却效果

    UnityShader3实现转圈与冷却效果

    这篇文章主要为大家详细介绍了UnityShader3实现转圈与冷却效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • 使用C#获取枚举名称的常见方法

    使用C#获取枚举名称的常见方法

    C# 为我们提供了多种解决方案来轻松获取枚举名称,这些方法各有千秋,适合不同场景,下面小编就和大家详细介绍一下吧,大家可以根据需要进行选择
    2025-11-11
  • C#定时器与延时操作的使用

    C#定时器与延时操作的使用

    本文详细介绍了C#开发中常用的定时器与延时机制,主要内容包括 定时器类对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04
  • 两路归并的数组与链表的实现方法

    两路归并的数组与链表的实现方法

    本篇文章对两路归并的数组与链表的实现方法进行了分析介绍。需要的朋友参考下
    2013-05-05

最新评论