独立线程按照推入的任务时间顺序执行任务

一、模型背景

有时,代码需要交个其他线程处理,也不关心执行的进度,但是关心执行的顺序。

二、代码实现

复制代码
    public class ThreadTaskChanel : IDisposable
    {

        // 创建任务队列
        private ConcurrentQueue<Action> _taskQueue = new ConcurrentQueue<Action>();

        // 创建事件
        private AutoResetEvent _taskAvailableEvent = new AutoResetEvent(false);

        private Thread _thread;

        public ThreadTaskChanel()
        {
            _thread = new Thread(() =>
            {
                while (true)
                {
                    if (_taskQueue.IsEmpty)
                        _taskAvailableEvent.WaitOne();

                    Action task;
                    if (_taskQueue.TryDequeue(out task))
                    {
                        try
                        {
                            task();
                        }
                        catch { }
                    }
                }
            });
            _thread.IsBackground = true;
            _thread.DisableComObjectEagerCleanup();
        }

        ~ThreadTaskChanel()
        {
            Dispose();
        }

        public void Start()
        {
            _thread?.Start();
        }

        public void Stop()
        {
            try
            {
                _thread?.Abort();
            }
            catch { }
        }


        public void PushToWork(Action action)
        {
            _taskQueue.Enqueue(action);
            _taskAvailableEvent.Set();
        }

        public void Dispose()
        {
            Stop();
        }
    }
复制代码

三、调用

复制代码
            ThreadTaskChanel threadTaskChanel = new ThreadTaskChanel();
            threadTaskChanel.Start();

            while (true) 
            {
                threadTaskChanel.PushToWork(() => {

                    Console.WriteLine($"{DateTime.Now.ToString("yyyy:MM:dd:HH:mm:ss")}  working...");
                });

                Thread.Sleep(1000);
            }

        }
复制代码

 

posted @   卖雨伞的小男孩  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2021-07-01 C# 上传文件添加其他参数
2021-07-01 C# 上传文件添加附加参数
2020-07-01 Windows进程间通信(IPC)之简述
2020-07-01 计算机网络之OSI七层模型
点击右上角即可分享
微信分享提示