C#/.NET에서 ManualResetEvent 및 AutoResetEvent 클래스를 사용하는 것에 대한 간단한 대안을 작성했습니다. 이 문제의 배경은 커널 잠금 객체를 사용하지 않고도 이벤트와 같은 기능을 사용하는 것이 었습니다.C#의 Manual/AutoResetEvent에 대한 간단한 대안
비록 코드가 테스트와 제작 모두에서 잘 작동하는 것으로 보이지만, 모든 가능성에 맞는 이런 종류의 것을 얻는 것은 복잡한 일이 될 수 있으며, 나는 StackOverflow 군중으로부터 어떤 건설적인 의견이나 비판을 겸허하게 요청할 것입니다. 잘하면 (검토 후) 이것은 다른 사람들에게 유용 할 것입니다.
사용법은 Set()에 사용되는 Notify()가있는 Manual/AutoResetEvent 클래스와 비슷해야합니다.
여기 간다 : 이것은 Win32에서 이벤트가 비싸다는 가정에서 작동
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);
}
}
}
당신은으로 ManualResetEvent/AutoResetEvents을 사용하여에이를 벤치마킹 적이 있습니까? 성능 차이는 얼마나 중요한가? – James
아니요 아직 주요 목표가 이벤트 객체를 사용하여 커널이 아닌 핸들/리소스를 만드는 것이 아니므로 아직하지 않았습니다. 나는 몇몇 시험을 설치하는 것을 시도 할 것이다, 감사합니다. – sweetlilmre
스레딩 프리미티브를 구현하는 것은 고유 한 암호화 알고리즘을 구현하는 것과 같습니다. 당신이 도메인의 전문가가 아니라면, 당신은 그것을 망칠 것입니다. 당신이 * 전문가 * 일지라도, 당신은 아직도 그것을 망칠지도 모른다. 하지 마. .NET 4에는 이미 "경량"버전 인'ManualResetEventSlim'과 관련 클래스가 있습니다. – Aaronaught