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)
当没有可用于处理请求的消费者时,有没有办法避免此超时?
这可能是一个迟到的答案,但我会这样做(假设您的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)