我正在寻找一种针对.NET Compact Framework的信号灯的快速有效的实现。在SO上还有另一个问题(Semaphores in .NET compact framework),建议使用P/Invoke,但这在XBox 360上运行的XNA Framework中是不可能的。

我可以提供两种自己的实现,但我认为这两种方法都不理想。

Semaphore using an AutoResetEvent (pastebin)
托管信号量的一种可能的实现方式是使用AutoResetEvent。

在这种情况下,当工作可用时,AutoResetEvent将仅将一个线程转换为“可运行”状态。当OS线程调度程序运行该线程时,它将重新打开AutoResetEvent,使下一个线程进入“可运行”状态。因此,线程将按顺序启动,并且仅在它们的前任实际执行之后才启动。

Semaphore using a ManualResetEvent (pastebin)
另一种可能的实现方式是使用ManualResetEvent。

在这种情况下,当工作可用时,ManualResetEvent会将所有线程转换为“可运行”状态。 OS线程调度程序运行的所有线程争夺工作项,直到第一个用尽线程的线程再次重置ManualResetEvent。换句话说,即使不是所有线程都需要,所有线程也可能在短时间内被唤醒。

有谁知道那里有更好的实现方案,或者可以提供改进我的建议吗?

最佳答案

编辑:没关系,只要阅读您引用的其他线程:Semaphore类本身是否不包含在XBox的CF中?
http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

否则,这是我在codeproject上找到的实现。我自己没有使用过,但也许可以作为引用:-)
http://www.codeproject.com/KB/threads/inprocsemaphore.aspx

关于compact-framework - XBox 360上的XNA是否有良好的信号灯?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1859964/

10-10 19:28