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