惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
罗磊的独立博客
小众软件
小众软件
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
博客园_首页
N
Netflix TechBlog - Medium
B
Blog
Recent Announcements
Recent Announcements
Y
Y Combinator Blog
Blog — PlanetScale
Blog — PlanetScale
L
LangChain Blog
F
Fortinet All Blogs
The GitHub Blog
The GitHub Blog
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
Last Week in AI
Last Week in AI
Jina AI
Jina AI
V
V2EX
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
博客园 - 【当耐特】

博客园 - 上海-天浩

ASP.NET WebApi(.Net Framework) 应用CacheManager 软件工程的核心问题并非是编程 C# ConcurrentQueue 处理多任务 c# 线程池多任务处理并返回值 最近忙的一个项目(B/S) 共享设备综合运营管理系统(自研) 自动充值机 面向对象的七种设计原则 SQL server 添加主外键约束 做过的项目 诗二首 诗三首 开源大全 C# PowerPoint操作的基本用法。 无锡质检局实验室管理系统 交互式电子白板 自己开发的 漂亮音乐播放器 钥匙齿形识别系统
C# 生产消费模式
上海-天浩 · 2022-03-25 · via 博客园 - 上海-天浩
    public class ProductionConsumptionHelper
    {
        public static readonly ProductionConsumptionHelper Instance = new ProductionConsumptionHelper();
        private ProductionConsumptionHelper()
        {
            
        }
        // 任务队列
        ConcurrentQueue<WorkItem> _tasksList = new ConcurrentQueue<WorkItem>();
        readonly object _locker = new object();
        // 通过 _wh 给工作线程发信号 
        EventWaitHandle _wh = new AutoResetEvent(false);
        Thread _worker;

        private void Start()
        {
            if (_worker == null|| !_worker.IsAlive)
            {
                lock (_locker)
                {
                    if (_worker == null || !_worker.IsAlive)
                    {
                        // 任务开始,启动工作线程
                          _worker = new Thread(Work);
                        _worker.Start();
                    }
                }
            }

        }

        /// <summary>消费线程的工作</summary>
        private void Work()
        {
            while (true)
            {
                WorkItem witem = null;
                if (_tasksList.Count > 0)
                {
                    _tasksList.TryDequeue(out witem); // 有任务时,出列任务

                    if (witem == null)  // 退出机制:当遇见一个null任务时,代表任务结束
                        return;
                }
                if (witem != null)
                {
                    if (witem.FuncName == "SaveImage")
                    {
                        try
                        {
                            Console.WriteLine(witem.FuncParams);
                            int i = 1;
                        }
                        catch (Exception ex)
                        { }

                    }
                }  // 任务不为null时,处理数据
                else
                    _wh.WaitOne();   // 没有任务了,等待信号
            }
        }

        /// <summary>插入任务</summary>
        public void EnqueueTask(List<WorkItem> tasklist)
        {
            if (_worker == null|| !_worker.IsAlive)
                Start();

            foreach (WorkItem witem in tasklist)
            {
                _tasksList.Enqueue(witem);  // 向队列中插入任务
            }
            _wh.Set();  // 给工作线程发信号
        }

        /// <summary>结束释放</summary>
        public void Dispose()
        {
            EnqueueTask(null);      // 插入一个Null任务,通知工作线程退出
            _worker.Join();         // 等待工作线程完成
            _wh.Close();            // 释放资源
        }

        /// <summary>处理任务</summary>
        public void DoAction(WorkItem data)
        {
            //
            Console.WriteLine(data.Orderid);
            Thread.Sleep(3000); 
        }

    }
    public class WorkItem
    {
        public WorkItem(string _Orderid,string _FuncName,object _FuncParams)
        {
            Orderid = _Orderid;
            FuncName = _FuncName;
            FuncParams = _FuncParams;
        }

        public string Orderid
        {
            get;
            set;
        }
        public string FuncName
        {
            get;
            set;
        }
        public object FuncParams
        {
            get;
            set;
        }
       


    }
  

测试代码:

 List<WorkItem> Orids = new List<WorkItem>() { };
            Orids.Add(new WorkItem("001", "SaveImage", "111"));
            Orids.Add(new WorkItem("002", "SaveImage", "12"));
            Orids.Add(new WorkItem("003", "SaveImage", "123"));
          ProductionConsumptionHelper.Instance.EnqueueTask(Orids);

总结:一个地方把要处理事情插入到一个队列里,后台启一个线程逐条地处理掉。