我正在寻找.NET Compact Framework的Semaphore的快速高效实现。这里曾经有一个关于SO的问题(Semaphores in .NET compact framework),其中建议使用P/Invoke,但在运行XBox 360上的XNA Framework中不可能实现。
我可以提供两种自己的实现,但我认为它们都不够优秀。 使用AutoResetEvent的Semaphore(pastebin)
一种可能的托管Semaphore的实现方式是使用AutoResetEvent。
在这种情况下,当工作可用时,AutoResetEvent只会将一个线程转换为“可运行”状态。当操作系统线程调度程序运行线程时,它将重新打开AutoResetEvent,将下一个线程带入“可运行”状态。因此,线程将按顺序启动,并且仅在其前任实际执行后才启动。
我可以提供两种自己的实现,但我认为它们都不够优秀。 使用AutoResetEvent的Semaphore(pastebin)
一种可能的托管Semaphore的实现方式是使用AutoResetEvent。
在这种情况下,当工作可用时,AutoResetEvent只会将一个线程转换为“可运行”状态。当操作系统线程调度程序运行线程时,它将重新打开AutoResetEvent,将下一个线程带入“可运行”状态。因此,线程将按顺序启动,并且仅在其前任实际执行后才启动。
使用ManualResetEvent的信号量 (pastebin)
另一种可能的实现方法是使用ManualResetEvent。
在这种情况下,当有任务可用时,ManualResetEvent将使所有线程进入“可运行”状态。操作系统线程调度器运行的所有线程都竞争工作项,直到第一个运行完工作的线程再次重置ManualResetEvent。换句话说,即使不需要所有线程,可能所有线程都会被唤醒短暂的时间。
是否有人知道更好的实现方法或者可以提供改进建议?