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