【发布时间】:2015-11-11 20:37:34
【问题描述】:
现在,我有一个 C# 程序,它会重复执行以下步骤:
- 从数据库中获取当前任务列表
- 使用 Parallel.ForEach(),为每个任务做工作
但是,其中一些任务运行时间很长。这会延迟其他待处理任务的处理,因为我们只在程序开始时寻找新任务。
现在,我知道修改被迭代的集合是不可能的(对吗?),但是 C# Parallel 框架中是否有一些等效的功能可以让我在处理列表中的项目的同时向列表中添加工作列表?
【问题讨论】:
-
您是否使用计时器从数据库中抓取任务?如果是这样,请在任务表中添加状态列并将任务标记为“处理中”。任务完成后,将其标记为“完成”。因此,在您的计时器内,您应该只抓取具有“空”状态的任务。关于任务列表,它应该在您的“ProcessTasks”方法中声明。这意味着每次计时器运行时,您都会得到一个新列表。
-
请原谅,但我不太明白这如何解决问题。我们确实在计时器上抓取任务并具有处理和完成列。问题是,一旦我们获取了任务列表并开始使用 Parallel.ForEach 处理它们,我们就会被困在 ForEach 中,直到所有处理完成。我想我们可以将 Parallel 处理放入 Task() 中,以便主线程可以继续其计时器。
-
并行应该为每个任务生成一个线程。这意味着如果您有 5 个任务,它们应该被独立处理,并且一旦这 5 个线程启动,您就应该退出循环,对吗?你看过线程安全collections吗?它可能会帮助你。
-
您确定 ForEach 在启动每个线程后返回吗?我可以发誓它会阻塞,直到所有线程都完成。
-
@KosalaW
Parallel.ForEach在枚举完每个元素或被中断之前不会完成。它很像传统的foreach循环,但可以并行执行。 msdn.microsoft.com/en-us/library/dd992001%28v=vs.110%29.aspx
标签: c# parallel-processing parallel.foreach