はい、問題なく動作します。しかしこれはSemaphoreクラスが設計されたものではありません。コードを維持するためにあなたの後ろに来る貧しい人をあわててください。彼はSemaphore.WaitOne()呼び出しがどこにあるのか不思議に思います。
この同じことを共有メモリで行うことは難しくありません。ここに必要なものはすべて...
string mapname = "{EE9D59F3-18F7-4FB6-B76B-AC1E6902BD9B}";
MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(mapname, sizeof(int));
MemoryMappedViewAccessor mmva = mmf.CreateViewAccessor(0, sizeof(int));
int count = Interlocked.Increment(ref *(int*)p.ToPointer());
これは誇りに思うコードではありません。/unsafeでコードをコンパイルする必要があります。
エレガントなアプローチがない場合は、デザインの前提を再確認する必要があります。なぜ最初に共有カウンターが必要なのですか?何かをユニークにする場合は、各プロセスでGUIDを生成してみませんか?合計を集計する場合は、サーバーに増分をポストする方が堅牢な方法が考えられます。あなたが本当に高性能のカウントを必要とするなら、おそらくC#はあなたの野望のための正しい手段ではないでしょう。
@ScottChamberlain、私はそれが正しいとは思わない。 'Release'がインクリメントされ、' WaitOne'が減少します。私はちょうど今LINQPadでそれをテストしました。 –