计时器经过处理程序中的Parallel.ForEach

时间:2018-06-20 09:13:48

标签: c# timer parallel-processing polling

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

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

编辑:我没有包含代码,因为它是如此简单。对于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的项目,则仅当在一个计时器经过的事件中在队列中同时看到了两个项目时,才会并行处理该项目。 。计时器间隔为5秒,如果将两个15秒部分相加,则会按顺序而不是并行处理它们。据推测,这是因为X的长时间运行阻碍了Y的处理,因为我们实际上仍处于该经过的处理程序中。 这也许是解释,也可能不是,但是,无论哪种方式,如何最好地做到“并行”处理?

0 个答案:

没有答案