He escrito lo que espero sea una alternativa ligera al uso de las clases ManualResetEvent y AutoResetEvent en C# /. NET. El razonamiento detrás de esto era tener un evento como la funcionalidad sin el peso de usar un objeto de bloqueo del kernel.Alternativa ligera a Manual/AutoResetEvent en C#
Aunque el código parece funcionar bien tanto en pruebas como en producción, conseguir este tipo de cosas correctas para todas las posibilidades puede ser una tarea tensa y humildemente solicito cualquier comentario constructivo y/o crítica del público de StackOverflow sobre esto. Con suerte (después de la revisión) esto será útil para otros.
El uso debe ser similar a las clases Manual/AutoResetEvent con Notify() utilizado para Set().
aquí va:
using System;
using System.Threading;
public class Signal
{
private readonly object _lock = new object();
private readonly bool _autoResetSignal;
private bool _notified;
public Signal()
: this(false, false)
{
}
public Signal(bool initialState, bool autoReset)
{
_autoResetSignal = autoReset;
_notified = initialState;
}
public virtual void Notify()
{
lock (_lock)
{
// first time?
if (!_notified)
{
// set the flag
_notified = true;
// unblock a thread which is waiting on this signal
Monitor.Pulse(_lock);
}
}
}
public void Wait()
{
Wait(Timeout.Infinite);
}
public virtual bool Wait(int milliseconds)
{
lock (_lock)
{
bool ret = true;
// this check needs to be inside the lock otherwise you can get nailed
// with a race condition where the notify thread sets the flag AFTER
// the waiting thread has checked it and acquires the lock and does the
// pulse before the Monitor.Wait below - when this happens the caller
// will wait forever as he "just missed" the only pulse which is ever
// going to happen
if (!_notified)
{
ret = Monitor.Wait(_lock, milliseconds);
}
if (_autoResetSignal)
{
_notified = false;
}
return (ret);
}
}
}
¿Usted como punto de referencia contra el uso de este ManualResetEvent/AutoResetEvents? ¿Qué tan significativa es la diferencia de rendimiento? – James
No, aún no he tenido el objetivo principal de crear un recurso/manejador que no sea kernel utilizando un objeto de evento. Aunque intentaré hacer algunas pruebas, gracias. – sweetlilmre
La implementación de sus propias primitivas de subprocesamiento es como implementar sus propios algoritmos de criptografía. A menos que sea un experto en el dominio, * lo * arruinará. Incluso si * eres * un experto, todavía * podrías * arruinarlo. No lo hagas .NET 4 ya tiene versiones "ligeras" de todos modos, 'ManualResetEventSlim' y clases relacionadas. – Aaronaught