2012-07-07 46 views
2

我正在试验System.Collections.Concurrent命名空间,但是我在实现我的设计时遇到问题。并行收集处理的应用程序设计

  1. 我的输入队列(ConcurrentQueue)正从线程中获得填充,该线程在启动时执行一些I/O以便读取和解析。
  2. 接下来,我启动输入队列上的Parallel.ForEach()。我正在为每个项目做一些I/O绑定工作。
  3. 为在ForEach()中处理的每个项目创建一个日志项目并将其放入结果队列中。

我想要做的是启动日志记录我开始阅读输入,因为我可能无法适应内存中的所有日志项目。等待物品落入结果队列的最佳方式是什么?是否有我应该关注的设计模式或示例?

+0

您是否可以不使用System.Collections.Concurrent中的简单BlockingCollection ?据推测,这种类型应该是一些“LogEntry”。 – 2012-07-07 02:46:56

回答

1

我认为你要找的图案是producer/consumer pattern。更具体地说,你可以有一个生产者/消费者implementation built around TPL and BlockingCollection

你想了解的主要概念是:

  1. Task
  2. BlockingCollection
  3. TaskFactory.ContinueWhenAll(可以让你当一组任务/线程运行完成执行一些动作) 。
  4. 限制和阻止在BlockingCollection。这允许您为输出集合设置最大大小(出于内存原因),生产者线程将等待消费者拾取元素,以防达到指定的最大大小。
  5. BlockingCollection.CompleteAdding and BlockingCollection.IsCompleted它可以用来同步生产者和消费者(生产者可以说它什么时候结束,消费者可以检查并持续运行,直到生产者完成)。

更完整的示例在我链接的第二篇文章中。

在你的情况下,我认为你希望消费者从结果队列中取出东西并尽快处理它们(将它们写入日志存储区或类似地方)。

因此,您最终收集的日志项应该是BlockingCollection,而不是ConcurrentQueue