Way*_*yne 32 .net c# queue continuations multitasking
我们有一个非常高性能的多任务处理,近乎实时的C#应用程序.这种性能主要通过在内部与本土调度程序一起实施协作式多任务处理来实现.这通常被称为微线程.在该系统中,所有任务都通过队列与其他任务进行通信.
我们所遇到的具体问题似乎只能通过C#不支持的一流延续来解决.
具体而言,问题出现在处理队列的2个案例中.每当任何特定任务在将项目放入队列之前执行某些工作时.如果队列已满,该怎么办?
相反,一个不同的任务可能会做一些工作,然后需要从队列中取出一个项目.如果那个队列是空的怎么办?
我们已经在90%的情况下通过将队列链接到任务来解决这个问题,以避免在任何出站队列已满或入站队列为空时调用任务.
此外,某些任务被转换为状态机,因此如果队列已满/空,它们可以处理并继续而无需等待.
真正的问题出现在一些边缘情况下,其中任何一种解决方案都是不切实际的.在这种情况下的想法是在该点保存堆栈状态并切换到另一个任务,以便它可以完成工作,并随后在能够继续时重试等待任务.
在过去,我们尝试将等待任务调用回调度(递归)以允许其他任务以及稍后重试等待任务.然而,这导致了太多的"僵局"情况.
有一个自定义CLR主机的示例,使.NET线程实际上作为"光纤"运行,这实际上允许在线程之间切换堆栈状态.但现在我似乎无法找到任何示例代码.此外,似乎需要一些重要的复杂性才能做到正确.
有没有人有任何其他创意,如何有效地切换任务,避免上述问题?
是否有其他CLR主机提供此商业或其他?是否有任何附加本机库可以为C#提供某种形式的延续?
事实上,我们已经决定了一个方向。我们将观察者模式与消息传递结合使用。我们建立了一个自行开发的库来处理“代理”之间的所有通信,类似于 Erlang 进程。稍后我们将考虑使用 AppDomains 更好地将代理彼此分开。设计思想借鉴了Erlang编程语言,该语言具有极其可靠的多核和分布式处理能力。
| 归档时间: |
|
| 查看次数: |
1456 次 |
| 最近记录: |