Sind Zustandsvariablen & Monitore in C# verwendet?Zustandsvariablen in C#
Kann mir jemand ein Beispiel geben?
Sind Zustandsvariablen & Monitore in C# verwendet?Zustandsvariablen in C#
Kann mir jemand ein Beispiel geben?
Das entspricht einer Zustandsgröße, die Sie gerade in .NET für die Signalisierung verwenden ist die abstrakte Klasse Waithandle. Praktische Implementierungen davon sind die Klassen ManualResetEvent und AutoResetEvent.
Eine Zustandsvariable, die Sie als Monitor verwenden, erfordert System.Threading.Monitor. Die C# lock
-Anweisung macht es sehr einfach zu verwenden, es stellt sicher, dass der Monitor immer beendet wird, ohne den Exit() - Aufruf explizit zu programmieren.
Beachten Sie, dass das Beenden eines Monitors, wenn Code eine Ausnahme auslöst, nicht unbedingt eine gute Sache ist. der Monitor hat wahrscheinlich eine Mutation geschützt, um sicherzustellen, dass das Ergebnis beim Verlassen des Monitors konsistent war; Eine Ausnahme ist der Nachweis, dass die Mutation nur teilweise abgeschlossen wurde und Sie daher gerade den Zugriff auf den inkonsistenten Zustand freigeschaltet haben. Wenn die Ausnahme abgefangen wird und das Programm fortgesetzt wird, können Sie sich nicht darauf verlassen, dass der Programmstatus konsistent ist. –
Sehr guter Punkt, ich reformierte das. Vielen Dank. –
Warte (verzeihe das Wortspiel). Sind irgendwelche von denen tatsächlich ein direktes Äquivalent einer Zustandsvariablen? Für meinen Laien sind sie nichts wie eine Zustandsvariable. In der Tat habe ich eine Webseite gesehen, die zeigt, wie man eine Zustandsvariable aus Windows-Kernel-Objekten wie Auto-Reset-Ereignissen erstellt, und es ist ein ziemlich komplexer Prozess mit mehr als einem solchen Kernel-Objekt ... – mackenir
Sie können das Lock-Objekt verwenden, das als syntaktischer Zucker für die Monitor-Klasse fungiert.
lock(someObject)
{
// Thread safe code here.
}
http://msdn.microsoft.com/en-us/library/c5kehkcz%28VS.80%29.aspx
Eine kleine Korrektur, es ist kein Objekt, sondern ein Schlüsselwort, und geschrieben Kleinbuchstaben, 'lock' :) – Skurmedel
Danke, in VB.NET bei der Arbeit entwickelt, so hatte SyncLock auf das Gehirn und nur entfernt den Sync-Teil heh . –
System.Threading.Monitor ist ein Weg (zB innerhalb)
Als Alternative zu ManualResetEvent und Freunden stellt Windows jetzt native support für Bedingungsvariablen bereit. Ich habe es selbst nicht getestet, aber es besteht eine gute Chance, dass sich Ihre Leistung verbessert, wenn Sie die native API nutzen.
Hier ist ein Artikel Code Project, das erklärt, wie diese (relativ neu) zuzugreifen konstruieren von C#:
Diese Version atomar einen Mutex oder ReaderWriterLockSlim entriegelt, während für die Signalisierung warten, und wieder verriegelt sie vor der Rückkehr - Das ist der Posix-Weg.
using System.Collections.Concurrent;
namespace System.Threading.More {
public class ConditionVariable {
private readonly ConcurrentQueue<ManualResetEventSlim> _waitingThreads = new ConcurrentQueue<ManualResetEventSlim>();
/// <summary>
/// Atomically unlocks and waits for a signal.
/// Then relocks the mutex before returning
/// </summary>
/// <param name="mutex"></param>
public void Wait(Mutex mutex) {
if (mutex == null) {
throw new ArgumentNullException("mutex");
}
var waitHandle = new ManualResetEventSlim();
try {
_waitingThreads.Enqueue(waitHandle);
mutex.ReleaseMutex();
waitHandle.Wait();
} finally {
waitHandle.Dispose();
}
mutex.WaitOne();
}
public void WaitRead(ReaderWriterLockSlim readerWriterLock) {
if (readerWriterLock == null) {
throw new ArgumentNullException("readerWriterLock");
}
var waitHandle = new ManualResetEventSlim();
try {
_waitingThreads.Enqueue(waitHandle);
readerWriterLock.ExitReadLock();
waitHandle.Wait();
} finally {
waitHandle.Dispose();
}
readerWriterLock.EnterReadLock();
}
public void Signal() {
ManualResetEventSlim waitHandle;
if (_waitingThreads.TryDequeue(out waitHandle)) {
waitHandle.Set();
}
}
public void Broadcast() {
ManualResetEventSlim waitHandle;
while (_waitingThreads.TryDequeue(out waitHandle)) {
waitHandle.Set();
}
}
}
}
Neben der Lock-Anweisung und der Monitor-Klasse, haben einen Blick auf waithandles (http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx) dem sehr nützlich sein und ersparen Sie sich vor langweiligen Boilerplate. – Skurmedel