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

推荐订阅源

博客园_首页
C
Cyber Attacks, Cyber Crime and Cyber Security
GbyAI
GbyAI
V
V2EX
M
MIT News - Artificial intelligence
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
量子位
Last Week in AI
Last Week in AI
T
The Blog of Author Tim Ferriss
H
Help Net Security
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
人人都是产品经理
人人都是产品经理
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
爱范儿
爱范儿
雷峰网
雷峰网
博客园 - 叶小钗
宝玉的分享
宝玉的分享
F
Fortinet All Blogs
The GitHub Blog
The GitHub Blog
D
DataBreaches.Net
PCI Perspectives
PCI Perspectives
Martin Fowler
Martin Fowler
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Proofpoint News Feed
T
Threatpost
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
O
OpenAI News
Latest news
Latest news
Hugging Face - Blog
Hugging Face - Blog
云风的 BLOG
云风的 BLOG
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Attack and Defense Labs
Attack and Defense Labs
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
Help Net Security
Help Net Security
T
Threat Research - Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
Microsoft Security Blog
Microsoft Security Blog
H
Heimdal Security Blog
N
Netflix TechBlog - Medium
L
LINUX DO - 最新话题
C
Check Point Blog
Hacker News: Ask HN
Hacker News: Ask HN
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
Scott Helme
Scott Helme

博客园 - 上海-天浩

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

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