1

BlockingCollection を使用して、1 つのプロデューサーと複数のコンシューマーを持つことを達成しようとしています。このようなコードを作成しました

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace TestConcQueue
{
    class Program
    {
        static void Main()
        {
            Producer producer = new Producer();

            List<Task> tasks = new List<Task>();
            for (int i = 0; i < 10; i++)
            {
                tasks.Add(Task.Factory.StartNew(TaskAction, new object[] {i, producer}));
            }

            while (true)
            {
                string line = Console.ReadLine();
                if (line == "q")
                {
                    producer.Add("x");
                    break;
                }

                producer.Add(line);
            }

            Task.WaitAll(tasks.ToArray());
        }

        private static void TaskAction(object o)
        {
            object[] data = (object[])o;
            int id = (int)data[0];
            Producer producer = (Producer)data[1];

            Console.WriteLine("Task with ID " + id + " started");
            foreach (string value in producer.Consumer)
            {
                Console.WriteLine("Task with ID " + id + " consumed value " + value);
                if (value == "x")
                    break;
            }

            Console.WriteLine("Task with ID " + id + " finished");            
        }
    }


    public class Producer
    {
        private readonly ConcurrentQueue<string> _items = new ConcurrentQueue<string>();
        private readonly BlockingCollection<string> _producer;

        public Producer()
        {
            _producer = new BlockingCollection<string>(_items);
        }

        public void Add(string item)
        {
            _producer.Add(item);
        }

        public IEnumerable<string> Consumer
        {
            get { return _producer.GetConsumingEnumerable(); }
        }
    }
}

しかし、要素を追加するたびに、その値を消費するタスクは 1 つだけで、他のすべてのタスクにはそれがありません。複数の消費者をシミュレートするにはどうすればよいですか。

Rx または TPL ライブラリを使用できません。

どうも

4

0 に答える 0