• c# Queue实现生产者(Producer)消费者(Consumer)模式


    我们在开发过程中经常会遇到需要从一个地方不断获取数据然后又需要交给另一个线程对数据进行二次加工的情况,这种场景适合使用生产者-消费者模式。

    Demo展示

      //中间的容器
      public static class Container
        {
            public static Queue<string> StringTemp = new Queue<string>();
        }
    
       /// <summary>
        /// 生产者
        /// </summary>
        public class Producer
        {
            Queue<string> StringContainer = new Queue<string>();
            public Producer(Queue<string> container)
            {
                this.StringContainer = container;
            }
            public void Produce()
            {
                StringContainer.Enqueue("i");
            }
        }
    
        /// <summary>
        /// 消费者
        /// </summary>
        public class Consumer
        {
            Queue<string> StringContainer = new Queue<string>();
            public Consumer(Queue<string> container)
            {
                this.StringContainer = container;
            }
            public void Consume()
            {
                var key = StringContainer.Dequeue();
                Console.WriteLine("{0},你好,当前线程ID为{1}" ,key, Thread.CurrentThread.ManagedThreadId.ToString());
            }
        }
      
    class Program { readonly static object _locker = new object(); static void Main(string[] args) { //生产者消费者模式 //开启生产 Action<string> produce = Product; produce.BeginInvoke("", null, null); //开启消费 Action<string> consume = Consume; consume.BeginInvoke("", null, null); //开启消费2 Action<string> consume2 = Consume; consume2.BeginInvoke("", null, null); Console.ReadLine(); } /// <summary> /// 生产 /// </summary> /// <param name="name"></param> static void Product(string name) { while (true) { Thread.Sleep(2000); lock (_locker) { if (Container.StringTemp.Count == 0) { new Producer(Container.StringTemp).Produce(); } else { Console.WriteLine("生产者没有任务"+Thread.CurrentThread.ManagedThreadId.ToString()); } } } } /// <summary> /// 消费 /// </summary> /// <param name="name"></param> static void Consume(string name) { while (true) { Thread.Sleep(1000); lock (_locker) { if (Container.StringTemp.Count > 0) { new Consumer(Container.StringTemp).Consume(); } else { Console.WriteLine("消费者没有任务" + Thread.CurrentThread.ManagedThreadId.ToString()); } } } } }

    运行效果如下图:

  • 相关阅读:
    ASP.NET SignalR HubPipelineModule
    MongoDB新版本特性
    Xamarin向iOS和Android引入C# Async支持
    Redis开源文档《Redis设计与实现》[转]
    WCF的追踪分析工具——SvcPerf
    Windows Azure移动服务更新,支持Android、活动目录和更多语言,并支持在东亚地区部署服务
    社区网站系统 jsGen
    单元测试同时支持 NUnit/MSTest
    .NET的微型Web框架 Nancy
    通过二维码登录(CSC模式)
  • 原文地址:https://www.cnblogs.com/chenxizhaolu/p/8627448.html
Copyright © 2020-2023  润新知