C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# ThreadStart委托

C#中ThreadStart委托的实现

作者:CoderIsArt

ThreadStart是.NET中的一个内置委托类型,表示无参数且无返回值的方法,本文主要介绍了C#中ThreadStart委托的实现,具有一定的参考价值,感兴趣的可以了解一下

1.ThreadStart 委托:

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

public delegate void 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 task = () => Console.WriteLine("Running in thread");
Thread thread = new Thread(task);
thread.Start();

线程安全注意事项

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();

优点

6. 关键区别:ThreadStart vs Action

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

总结

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

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

您可能感兴趣的文章:
阅读全文