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

 

posted @ 2017-08-14 16:50  匡匡  阅读(310)  评论(0编辑  收藏  举报