3

我正在寻找.NET Compact Framework的信号量的快速高效的实现。在SO(Semaphores in .NET compact framework)上有另一个问题,其中建议使用P/Invoke,但在XBox 360上运行的XNA Framework中不可能。在XBox 360上XNA有一个很好的信号量吗?

我可以提供两个我自己的实现,但我相信这两者都不是最优的。

Semaphore using an AutoResetEvent(引擎收录)
一种可能的实施有管理的信号量会,使用的AutoResetEvent。

在这种情况下,当工作变得可用时,AutoResetEvent将只将一个线程转换为'runnable'状态。当OS线程调度程序运行线程时,它将重新打开AutoResetEvent,使下一个线程进入'可运行'状态。所以线程将按顺序启动,并且只有在它们的前任实际执行后才会启动。

Semaphore using a ManualResetEvent(引擎收录)
另一种可能的实现将被使用的ManualResetEvent。

在这种情况下,当工作变得可用时,ManualResetEvent将所有线程转换为'runnable'状态。操作系统线程调度程序运行的所有线程均竞争工作项,直到第一个线程运行结束后再次重置ManualResetEvent。换句话说,即使并非所有线程都是必需的,可能所有线程都会在短时间内被唤醒。

有谁知道有更好的实施或可以提供改进我的建议吗?

+0

对我来说像自动重置事件是这里的投注选项 – Martin 2009-12-08 11:05:34

+0

等等,你有没有在XBox上的任何PInvokes?给开发者CF但不允许PInvokes有点不公平。说实话,PInvoke通常是任何“CF”解决方案的一部分。 – Quibblesome 2009-12-08 12:08:31

+0

不,对于安全原因,xbox上没有pinvokes。您只能访问任何可通过托管代码访问的API – 2009-12-08 21:45:20

回答

2

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

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

+0

感谢CodeProject链接!虽然这篇文章中的代码比F1比赛有更多的竞争条件,但是使用数组和waitHandle.WaitAny()给了我一些新的想法:) – Cygon 2009-12-10 06:56:47

+0

如果你可以在你的实现工作时发布你的实现,那将是非常棒的: - ) – 2010-01-06 16:27:53

0

OpenNetCF具有紧凑的框架Semaphore class。是否有任何理由不能在Xbox上使用OpenNetCF库?

+0

他在说XNA,这真的是一个有界的沙箱,有一些CF的东西。不幸的是,由于XNA提供直接API调用/ P/Invoke的限制,SDF不适用于XNA。 – ctacke 2010-02-24 20:36:31