c# - 计时器经过处理程序中的 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 的处理,因为我们实际上仍在那个经过的处理程序中。这可能是也可能不是解释,但是,无论哪种方式,如何最好地“并行”进行此处理?
解决方案
推荐阅读
- android - 当我将 gradle 版本从 5.4.1 升级到 6.5 时的 Multidex 混淆问题
- syslog-ng - syslog-ng 读取和删除通配符文件选项
- pine-script - 您如何检测到最后一根蜡烛之前的蜡烛?
- python - 在python多处理池中实现生产者消费者模式的正确方法
- oracle - Oracle EF Database first 未完成
- html - 帖子中的滚动滞后(仅限 IE)
- swift - 如何避免死锁从主线程调用自定义 DispatchQueue 同步?
- javascript - NextJS 卡住,无法导航,无法刷新,一段时间后无法热重载
- python-3.7 - 编译的 Python3 模块产生错误“动态模块未定义模块导出功能”
- c - 可以做些什么来让 GCC 更快地编译带有数千个案例的 switch 语句吗?