我有一个处理作业的 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)在它的库中为这种情况提供了更好的工具。