首页 > 解决方案 > 计时器经过处理程序中的 Parallel.ForEach

问题描述

我正在尝试调整一些队列处理代码(C# 4.0),它在 Windows 服务中的计时器已用事件上运行。用于调用的代码,例如 ProcessAllQueueItems()。

我现在想根据项目的来源并行处理不同类型的项目,一个想法只是在 Parallel.ForEach 循环中用 ProcessQueueItem(sourceName) 替换 process-all 调用,用一个数组(众所周知) 源名称作为循环变量。

编辑:我没有包含代码,因为它很简单。对于 SourceA,ProcessQueueItem 可能会运行 5 秒,对于 SourceB,可能会运行长达一小时。问题是/是处理 SourceB 阻止了对来自其他来源的数据的处理。队列是 SQL 中的一个表,其中包含处理时间可变的序列化对象。我可以看到为什么它不起作用,但我不确定会发生什么,尽管我会仔细阅读 Dataflow,这对我来说是新的(由于第三方 API 的限制,我只能使用 .Net 4.0)。

void pollTimer_Elapsed(object sender, ElapsedEventArgs e)
{
  string[] sources = new string[] { "SourceA", "SourceB", "SourceC" };
  Parallel.ForEach(sources, source =>
  {
    ProcessQueueItem(source);
  });
}

它并不总是有效。

如果您将源 X 中的项目添加到队列中,它会被处理,如果您添加源 Y 中的项目,则只有在一个计时器已用事件中在队列中看到这两个项目时才会并行处理。计时器间隔为 5s,如果将这两项相加 15s 部分,它们将按顺序处理,而不是并行处理。这大概是因为 X 的长时间运行的处理阻塞了 Y 的处理,因为我们实际上仍在那个经过的处理程序中。这可能是也可能不是解释,但是,无论哪种方式,如何最好地“并行”进行此处理?

标签: c#timerparallel-processingpolling

解决方案


推荐阅读