我正在寻找一种快速有效的.NET Compact Framework信号量实现方法。在SO(Semaphores in .NET compact framework)上有另一个问题,其中建议使用P / Invoke,但这在XBox 360上运行的XNA Framework中是不可能的。
我可以提供我自己的两个实现,但我相信两者都是次优的。
Semaphore using an AutoResetEvent (pastebin)
托管信号量的一种可能实现方式是使用AutoResetEvent。
在这种情况下,当工作可用时,AutoResetEvent只会将一个线程转换为“可运行”状态。当OS线程调度程序运行该线程时,它将重新打开AutoResetEvent,使下一个线程进入'runnable'状态。因此线程将按顺序启动,并且只有在它们的前任实际执行后才会启动。
Semaphore using a ManualResetEvent (pastebin)
另一种可能的实现方式是使用ManualResetEvent。
在这种情况下,当工作可用时,ManualResetEvent会将所有线程转换为“runnable”状态。操作系统线程调度程序运行的所有线程都会争用工作项,直到第一个用完工作的线程再次重置ManualResetEvent。换句话说,即使并非所有线程都是必需的,也可能短时间唤醒所有线程。
有没有人知道更好的实施或者可以提供改进我的建议?
答案 0 :(得分:2)
编辑:没关系,只需读取您引用的其他线程: Semaphore类本身是否未包含在XBox的CF中? http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx
否则,这是我在codeproject上找到的实现。没有自己使用它,但也许它可以作为参考:-)
http://www.codeproject.com/KB/threads/inprocsemaphore.aspx
答案 1 :(得分:0)
OpenNetCF对于紧凑框架有一个Semaphore class。你有什么理由不能在Xbox上使用OpenNetCF库吗?