我正在尝试修改一些队列处理代码(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的处理,因为我们实际上仍处于该经过的处理程序中。 这也许是解释,也可能不是,但是,无论哪种方式,如何最好地做到“并行”处理?