2009-07-16 12 views
4

In .NET gibt es eine Möglichkeit, die Zahl auf einem Semaphor zu erhalten. Ich brauche keine threadsafe count, nur eine vernünftige Annäherung, also melden Sie den Status auf einem GUI-Thread.Semaphor zählt

Derzeit verwende ich einen Dual-Counter. Der echte Semaphor und eine andere Variable, die synchron erhöht und dekrementiert wird, aber das ist ärgerlich und fehleranfällig.

Antwort

0

Nein. Um dies zu tun, müssten Sie Semaphore in etwas mit einem Zähler umwandeln (Unterklasse). Da Sie sich nicht um die Sicherheit von Fäden kümmern, wird es nicht so schwer sein.

+0

Seufz, ich hatte Angst, du würdest das sagen. –

2

Anstelle des Semaphors könnten Sie Interlocked.Increment und Interlocked.Decrement verwenden. Dadurch können Sie den aktuellen Wert einfach lesen, da es sich um eine normale Variable handelt.

Wenn Sie es in Verbindung mit einer Art von Mutex für die Situation verwenden, in der die Anzahl 0 erreicht, sollte das die Arbeit erledigen. Wenn Sie von Ihrem ausgewählten Mutex oder WaitHandle geerbt haben, erhalten Sie eine nützliche, wiederverwendbare Komponente.

Siehe die Interlocked Klasse.

+0

Sie haben gerade beschrieben, was ich schon gesagt habe. –

+0

Was ist das Problem? Es ist nicht von Natur aus fehleranfällig, obwohl Sie wahrscheinlich von der Verwendung von Interlocked abweichen und stattdessen eine andere Sperre verwenden müssen. Wenn Ihre Implementierung ein Problem aufweist, veröffentlichen Sie sie auf SO. Wie nervig .. gut, manchmal müssen Sie selbst Code schreiben. – Thorarin

0

Process Explorer tut es irgendwie. Es beinhaltet wahrscheinlich die Magie der tiefen Windows-API, da es sowohl die maximale Anzahl als auch die aktuelle Anzahl extrahiert.

können Sie auch versuchen, das moralische Äquivalent von

int old_count=0; 
if (AcquireSemaphore(timeout=0)) { 
    ReleaseSemaphore(&old_count); 
    old_count += 1; 
} 

dies hat jedoch den Nachteil, dass sie Code leicht aufdringlich ist, dass die Semaphore verwendet.