专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-963-0016      微信咨询  |  联系我们

C#排队处理DEMO

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 0:41:41       共计:3646 浏览
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace TestWait
{
    class Program
    {
        public static Queue<Proccess> QueueMessage = new Queue<Proccess>();
        static int count = 15;//只有15张票

        static void Main(string[] args)
        {
            
            StartProccess();
            //模拟并发 20个人同时买票
            for (int i = 0; i < 20; i++)
            {
                
                ThreadPool.QueueUserWorkItem(new WaitCallback ((o)=>{
                    string index = (string)o;
                    Bay(index);
                }),"客户端"+i);
            }
            Console.ReadKey();
        }

        //购买服务
        static bool Bay(String val)
        {
            Proccess p = new Proccess();
            p.val = val;
            p.ManualReset = new ManualResetEvent(false);
            //lock (QueueMessage)
            {
                QueueMessage.Enqueue(p);//消息入列
                Console.WriteLine("入列:" + val);
            }
            WaitHandle.WaitAll(new WaitHandle[] { p.ManualReset });//等待处理完成
            return p.Result;
        }

        //启动处理线程
        static void StartProccess()
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(ProccessThread));
        }

        //处理线程
        static void ProccessThread(Object obj)
        {
            while (true)
            {
                if (QueueMessage.Count > 0)
                {
                    Proccess message = QueueMessage.Dequeue();
                    if (count <= 0)
                    {
                        message.Result = false;
                        Console.WriteLine("处理失败:" + message.val);
                    }
                    else
                    {
                        message.Result = true;
                        Console.WriteLine("处理成功:" + message.val);
                    }
                    count--;
                    if (message.ManualReset != null)
                        message.ManualReset.Set();
                }
                else
                {
                    //如果没有消息 停止3s
                    Thread.Sleep(3000);
                }
            }
        }
    }


    class Proccess{
        public ManualResetEvent ManualReset
        {
            get;
            set;
        }

        public bool Result
        {
            get;
            set;
        }

        public String val
        {
            get;
            set;
        }
    }
}
版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:清除浏览器input中缓存 | ·下一条:C#中sealed关键字

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有