BlockingCollection 集合隨記

匡匡發表於2017-08-14

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

 

相關文章