我们有一个非常高性能的多任务、近乎实时的 C# 应用程序。这一性能主要是通过使用自制的调度程序在内部实施协作多任务来实现的。这通常称为微线程。在这个系统中,所有任务都通过队列与其他任务通信。
我们遇到的具体问题似乎只能通过 C# 不支持的第一类延续来解决。
具体来说,该问题出现在处理队列的两种情况下。每当任何特定任务在将项目放入队列之前执行某些工作时。如果队列满了怎么办?
相反,不同的任务可能会完成一些工作,然后需要从队列中取出一个项目。如果该队列为空怎么办?
我们通过将队列链接到任务来解决 90% 的情况,以避免在任何出站队列已满或入站队列为空时调用任务。
此外,某些任务被转换为状态机,因此它们可以处理队列是否已满/空并继续执行而无需等待。
真正的问题出现在一些边缘情况下,在这些情况下执行任何一种解决方案都是不切实际的。该场景的想法是保存此时的堆栈状态并切换到不同的任务,以便它可以完成工作,然后在能够继续时重试等待任务。
过去,我们尝试将等待任务回调到调度中(递归地),以允许其他任务稍后重试等待任务。然而,这导致了太多“僵局”的情况。
有一个自定义 CLR 主机的示例,使 .NET 线程实际上作为“纤程”运行,这本质上允许在线程之间切换堆栈状态。但现在我似乎找不到任何示例代码。另外,似乎需要一些相当大的复杂性才能做到正确。
有没有人有任何其他创意想法如何有效地在任务之间切换并避免上述问题?
是否有任何其他 CLR 主机提供此功能(商业或其他方式)?是否有任何附加本机库可以为 C# 提供某种形式的延续?