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