public static void NoTimeoutAcquire(Action enterWaiting, Func <int, bool> getResult, Action convertWaitingToAcquired, Action exitWaiting) { try { enterWaiting(); bool result = false; int timeout = initialTimeout; while (!result) { if (timeout > initialTimeout || timeout == Timeout.Infinite) { DeadlockMonitor.DetectDeadlocksInternal(Thread.CurrentThread); } result = getResult(timeout); timeout = timeout == initialTimeout ? secondTimeout : Timeout.Infinite; } convertWaitingToAcquired(); } finally { exitWaiting(); } }