• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

运行效果如下图:


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap