单生产者多个消费者实施

Chr*_*sto -2 c# multithreading

考虑以下情况

 private BlockingCollection<Consumer> consumers { get; set; }


 ThreadPool.QueueUserWorkItem((x) => {

                while (consumers.Count == 0)
                    Thread.Sleep(20);

                Consumer consumer;
                if (consumers.TryTake(out consumer)) {
                    var result = consumer.Read(data);
                    //do stuff with result
                    if (consumers.TryAdd(consumer)) {
                        //ok
                    }
                }
            });
Run Code Online (Sandbox Code Playgroud)

当没有可用于处理请求的消费者时,有没有办法避免此超时?

Ese*_*ser 5

这可能是一个迟到的答案,但我会这样做(假设您的Producer生成一些字符串数据,消费者使用它们)

public class PC
{
    const int THREADS = 5;
    static BlockingCollection<string> _Collection = new BlockingCollection<string>();

    public PC()
    {
        //1 producer  
        Task.Run(()=>Producer());
        //N consumer
        for (int i = 0; i < THREADS; i++) Task.Run(() => Consumer());
    }

    void Producer()
    {
        Random rnd = new Random();
        while(true)
        {
            Thread.Sleep(100); //Not to flood our case...
             //Produce it
            _Collection.Add(rnd.Next().ToString());
        }
    }

    void Consumer()
    {
        while(true)
        {
            string str = _Collection.Take();
            //Consume it
            Console.WriteLine("Thread \"{0}\" consumed {1}", Thread.CurrentThread.ManagedThreadId, str);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)