public bool TryWait(int millisecondsTimeout)
{
lock (_syncRoot)
{
if (_released) //We've been released before we even started waiting!
return true;
try
{
bool success = Monitor.Wait(_syncRoot, millisecondsTimeout);
if (!success)
_released = true; //Note that we've been released early
return success;
}
catch (ThreadInterruptedException)
{
if (_released == false)
{
_released = true; //Note that we've been released early
throw;
}
//We've already been released, so we might as well succeed at
//the operation and get interrupted later
Thread.CurrentThread.Interrupt();
return true;
}
}
}