java: public void run() {long lastReopenStartNS = System.nanoTime();while (!finish) {while (!finish) {reopenLock.lock();try {boolean hasWaiting = waitingGen > searchingGen;final long nextReopenStartNS = lastReopenStartNS + (hasWaiting ? targetMinStaleNS : targetMaxStaleNS);final long sleepNS = nextReopenStartNS - System.nanoTime();if (sleepNS > 0) {reopenCond.awaitNanos(sleepNS);} else {break;}} catch (InterruptedException ie) {Thread.currentThread().interrupt();return;} finally {reopenLock.unlock();}}if (finish) {break;}lastReopenStartNS = System.nanoTime();refreshStartGen = writer.getMaxCompletedSequenceNumber();try {manager.maybeRefreshBlocking();} catch (IOException ioe) {throw new RuntimeException(ioe);}}}
C#: public override void Run(){long lastReopenStartNS = DateTime.UtcNow.Ticks * 100;while (!finish){bool hasWaiting;lock (this)hasWaiting = waitingGen > searchingGen;long nextReopenStartNS = lastReopenStartNS + (hasWaiting ? targetMinStaleNS : targetMaxStaleNS);long sleepNS = nextReopenStartNS - Time.NanoTime();if (sleepNS > 0) try { reopenCond.WaitOne(TimeSpan.FromMilliseconds(sleepNS / Time.MILLISECONDS_PER_NANOSECOND)); }catch (ThreadInterruptedException ie){Thread.CurrentThread.Interrupt();return;} if (finish){break;}lastReopenStartNS = Time.NanoTime();refreshStartGen = writer.GetAndIncrementGeneration();try{manager.MaybeRefreshBlocking();}catch (System.IO.IOException ioe){throw new Exception(ioe.ToString(), ioe);}}RefreshDone();}