文章出處

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

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()