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

推荐订阅源

Engineering at Meta
Engineering at Meta
博客园_首页
H
Help Net Security
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
B
Blog
I
InfoQ
SecWiki News
SecWiki News
T
Tailwind CSS Blog
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Vulnerabilities – Threatpost
N
Netflix TechBlog - Medium
P
Palo Alto Networks Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Vercel News
Vercel News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
Kaspersky official blog
M
MIT News - Artificial intelligence
S
Schneier on Security
T
Threat Research - Cisco Blogs
F
Fortinet All Blogs
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
aimingoo的专栏
aimingoo的专栏
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
The Cloudflare Blog
Recent Announcements
Recent Announcements
Security Latest
Security Latest
G
GRAHAM CLULEY
IT之家
IT之家
Y
Y Combinator Blog
The Last Watchdog
The Last Watchdog
腾讯CDC
Google DeepMind News
Google DeepMind News
V
V2EX
S
Securelist
TaoSecurity Blog
TaoSecurity Blog
B
Blog RSS Feed
S
SegmentFault 最新的问题
博客园 - 叶小钗
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
Project Zero
Project Zero
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
F
Full Disclosure

博客园 - 上海-天浩

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

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