1

我有一个处理作业的 Windows 服务。此服务中的作业是一系列操作,例如:

A -> B -> C -> D -> E

每个工作都应该完全独立于其他工作。当前实现在其自己的线程(在本例中为new System.Threading.Thread)上处理每个作业,这在大多数情况下运行良好。然而,事实证明 B 动作不是线程安全的,两个线程不应该同时处理 B 动作。如果两个线程同时尝试执行 B 动作,有时会出现奇怪的结果或错误。请注意,其他操作可能由多个作业同时执行而不会产生任何不良影响。

我不想尝试以线程安全的方式重新实现 B 操作(我预计这将需要大量资源来实现和测试),我只想将每个 B 操作一次限制为单个线程.

现在对我来说显而易见的初始解决方案是lock在 B 操作周围放置 a,这肯定会将其限制为单个线程。然而,这个解决方案似乎不能保证所有等待的线程都有机会处理 B 动作。这是因为不能保证线程以 FIFO 或一致的方式排队。我觉得这在理论上可能会导致线程饥饿。因此,我对实施此解决方案感到不舒服。

所以我的问题是如何在 .NET 中实现一个更好的(可能是 FIFO)作业队列,以保证所有作业都将通过 B 操作,一个接一个?

我目前的想法是,我可以维护某种“管理器”线程,其工作是从队列中拉出一个作业线程并在 B 操作明确时执行它。(也许我正在描述实现我自己的调度程序?)但这似乎很粗糙,也许 .NET(我正在使用 .NET 4.0)在它的库中为这种情况提供了更好的工具。

4

2 回答 2

2

您可能追求的是类似于创造者-消费者模式的东西。这个 stackoverflow 帖子有一个很好的阻塞队列实现。所以你可以让多个线程向它添加东西,并且只有一个线程永远从中读取东西(当队列为空时它会阻塞)

于 2013-01-03T18:15:42.713 回答
1

查看 Windows 工作流程http://msdn.microsoft.com/en-us/vstudio/jj684582.aspx或quartz.net http://quartznet.sourceforge.net/

于 2013-01-03T18:16:32.550 回答