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

 

相关文章:

  • 2022-01-20
  • 2021-08-02
  • 2021-12-30
  • 2021-10-08
  • 2021-05-29
  • 2021-07-19
  • 2021-10-25
  • 2022-02-05
猜你喜欢
  • 2022-12-23
  • 2021-09-20
  • 2021-10-02
  • 2022-02-18
  • 2021-06-07
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案