Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在通用生产者/消费者中使用任务_C#_Multithreading_Parallel Processing_Producer Consumer - Fatal编程技术网

C# 在通用生产者/消费者中使用任务

C# 在通用生产者/消费者中使用任务,c#,multithreading,parallel-processing,producer-consumer,C#,Multithreading,Parallel Processing,Producer Consumer,我正在尝试使用BlockingQueue构建通用生产者/消费者。 我希望它尽可能多线程或并行,但不占用所有计算机资源。 假设我们有一个生产商,是将消费者作为线程还是将消费者作为线程 使用数据时的任务 while(true) { queue.TryTake(...) { Task.Factory.StartNew(...); } } 或 Thread t = new Thread(Consumer.Start); 如果您担心计算机资源,一个解决方案可能是创建一个工作线程池,所有工作线


我正在尝试使用BlockingQueue构建通用生产者/消费者。
我希望它尽可能多线程或并行,但不占用所有计算机资源。
假设我们有一个生产商,是将消费者作为线程还是将消费者作为线程 使用数据时的任务

while(true)  
{
   queue.TryTake(...) { Task.Factory.StartNew(...); }
}

Thread t = new Thread(Consumer.Start);

如果您担心计算机资源,一个解决方案可能是创建一个工作线程池,所有工作线程都监视任务队列,一旦任务被放入队列,并且工作线程空闲,它就会从队列中读取任务并开始工作

这应该很容易设置

//丹尼尔可能是一个组合

您的第一个建议存在一个问题,即当队列很满时,您将开始很多任务,可能太多

第二个只使用一个线程(我想这就是你在这里的意思)

您可能应该启动N个消费者并为N设置一些策略。这在很大程度上取决于工作量、I/O的使用等

可能的策略是

  • N=核数(-1)
  • 当Queue.Count>M时启动新的使用者

您还可以使用任务(带有LongRunning选项)而不是线程

@guy:当它们不断堆积的时候。小心不要将负担从阻塞(!)集合移动到任务队列。明白了。。这是一个很好的想法,我没有想到。解决方案就是给全局线程池来处理任务,不是吗?当然,这是一种方法。除了对队列进行一些监视外,还可以将工作分派到线程池。至少在任务运行时间不太长的情况下。