Les variables d'état & sont-elles utilisées en C#?Variables d'état en C#
Quelqu'un peut-il me donner un exemple?
Les variables d'état & sont-elles utilisées en C#?Variables d'état en C#
Quelqu'un peut-il me donner un exemple?
L'équivalent d'une variable condition que vous utilisez juste pour la signalisation dans .NET est la classe abstraite WaitHandle. Les implémentations pratiques sont les classes ManualResetEvent et AutoResetEvent.
Une variable d'état que vous utilisez en tant que moniteur nécessite System.Threading.Monitor. L'instruction C# lock
le rend très facile à utiliser, il assure que le moniteur est toujours quitté sans programmation explicite de l'appel Exit().
Notez que quitter un moniteur si le code déclenche une exception n'est pas forcément une bonne chose; le moniteur protégeait probablement une mutation pour s'assurer que le résultat à la sortie du moniteur était cohérent; une exception est la preuve que la mutation n'a été que partiellement terminée et que vous venez de déverrouiller l'accès à un état incohérent. Si l'exception est interceptée et que le programme continue, vous ne pouvez pas vous fier à la cohérence de l'état du programme. –
Très bon point, je l'ai reformulé. Merci. –
Attendez (pardonnez le jeu de mots). Certains d'entre eux sont-ils réellement l'équivalent direct d'une variable de condition? Pour mon œil non-expert, ils n'ont rien à voir avec une variable de condition. En fait, j'ai vu une page web qui montre comment construire une variable de condition à partir d'objets du noyau Windows comme les événements de réinitialisation automatique, et c'est un processus assez complexe impliquant plus d'un objet noyau ... – mackenir
Vous pouvez utiliser l'objet Lock qui agit comme sucre syntaxique pour la classe Monitor.
lock(someObject)
{
// Thread safe code here.
}
http://msdn.microsoft.com/en-us/library/c5kehkcz%28VS.80%29.aspx
Une petite correction, ce n'est pas un objet, mais un mot-clé, et est orthographié en minuscule, 'lock' :) – Skurmedel
Merci, été en développement dans VB.NET au travail, avait donc SyncLock sur le cerveau et vient de supprimer la partie Sync heh . –
System.Threading.Monitor est une façon (par exemple à l'intérieur)
Comme alternative à ManualResetEvent et à ses amis, Windows fournit maintenant native support pour les variables de condition. Je ne l'ai pas référencé moi-même, mais il y a de fortes chances que vos performances s'améliorent en exploitant l'API native.
est ici un article du projet de code qui explique comment accéder à ce (relativement nouvelle) construction de C#:
Cette version déverrouille atomiquement un Mutex ou ReaderWriterLockSlim en attendant la signalisation, et se verrouille de nouveau avant de retourner - qui est la façon Posix.
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();
}
}
}
}
Outre la déclaration de verrouillage et la classe de moniteur, jetez un oeil à WaitHandles (http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx) qui peut sois très utile et vous évite de passer à côté de la question. – Skurmedel