zoukankan      html  css  js  c++  java
  • BlockingCollection 集合随记

    BlockingCollection 集合是一个并发安全的集合,而且设计用来实现类似于消息队列的功能,生产者、消费者模式。

    static void Main(string[] args)
    {
        BlockingCollection<string> list = new BlockingCollection<string>();
    
        // task1 是一个生产者,用来向 BlockingCollection 集合添加元素
        var task1 = Task.Factory.StartNew(() =>
        {
            Console.WriteLine("enter:");
            while (true)
            {
                string str = Console.ReadLine();
                if (str == "Q")
                {
                    list.CompleteAdding();
                    break;
                }
    
                if (str.IndexOf(",") != -1)
                {
                    string[] parts = str.Split(',');
                    foreach (var s in parts)
                        list.Add(s);
                }
                else
                    list.Add(str);
            }
        });
    
        // task2 和 task3 是消费者,从 BlockingCollection 集合中取出来元素来处理,
        // 使用 TryTake 方法从集合中取出一个元素,如果集合中没有元素则等待,直接有元素返回为止
        var task2 = Task.Factory.StartNew(() =>
        {
            ProcessItem();
        });
        var task3 = Task.Factory.StartNew(() =>
        {
            ProcessItem();
        });
    
        Task.WaitAll(task1, task2, task3);
        Console.WriteLine("OK");
    }
    
    private void ProcessItem()
    {
        while (true)
        {
            string str = string.Empty;
            if (list.TryTake(out str, -1))
            {
                Console.WriteLine(string.Format("TID:{0}, str:{1}", Thread.CurrentThread.ManagedThreadId, str));
            }
            else
            {
                Console.WriteLine("exit");
                break;
            }
        }
    }
  • 相关阅读:
    systemtap没找到函数变量
    systemtap get var of the tracepoing
    如何在tracepoint上注册函数
    stap中的entry函数
    stap用法
    在submit_bio处使用stapn
    巴达努斯
    perf事件的切换
    perf原理再看
    内存回收的阈值
  • 原文地址:https://www.cnblogs.com/kuku/p/7358711.html
Copyright © 2011-2022 走看看