Napisałem, co mam nadzieję, jest lekką alternatywą dla używania klas ManualResetEvent i AutoResetEvent w C#/.NET. Powodem tego było posiadanie funkcjonalności typu Event bez wagi użycia obiektu blokującego jądro.Lekka alternatywa dla Manual/AutoResetEvent w C#
Mimo że kod wydaje się działać dobrze zarówno w testowaniu, jak i produkcji, uzyskanie tego wszystkiego w sposób właściwy dla wszystkich możliwości może być dużym przedsięwzięciem, a ja pokornie zażądam wszelkich konstruktywnych komentarzy i komentarzy od użytkowników StackOverflow na ten temat. Mam nadzieję, że (po przeglądzie) będzie to przydatne dla innych.
Użycie powinno być podobne do klas Manual/AutoResetEvent z funkcją Notify() używaną do Set().
Tu idzie:
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);
}
}
}
byłaś porównywana to przed użyciem ManualResetEvent/AutoResetEvents? Jaka jest różnica w wydajności? – James
Nie, jeszcze nie tak, ponieważ głównym celem było uczynienie obsługi/zasobu bez jądra za pomocą obiektu zdarzenia. Spróbuję jednak przygotować kilka testów, dzięki. – sweetlilmre
Wdrażanie własnych prymitywów wątków jest jak wdrażanie własnych algorytmów kryptograficznych. Jeśli nie jesteś ekspertem w dziedzinie, możesz to * zepsuć. Nawet jeśli * jesteś * ekspertem, nadal * możesz * zepsuć to. Nie rób tego. .NET 4 i tak ma już "lekkie" wersje, 'ManualResetEventSlim' i podobne klasy. – Aaronaught