protected virtual void OnIdleStateChanged(object sender, IdleStateEventArgs e) { if (eventArgsSubject != null) { eventArgsSubject.Publish(e); } }
protected void Init() { if (!(enableReaderIdle || enableWriterIdle || enableAllIdle)) { return; } long t = DateTime.Now.Ticks; readerIdleCheckTime = t + readerIdleTime.Ticks; writerIdleCheckTime = t + writerIdleTime.Ticks; allIdleCheckTime = t + allIdleTime.Ticks; firstReaderIdle = firstWriterIdle = firstAllIdle = true; this.cancellationTokenSource = new CancellationTokenSource(); this.cancellationToken = cancellationTokenSource.Token; Task.Run(() => { try { while (true) { if (this.cancellationToken.IsCancellationRequested) { break; } long ticks = DateTime.Now.Ticks; if (connected) { try { IdleStateEventArgs readerIdleEventArgs = null; IdleStateEventArgs writerIdleEventArgs = null; IdleStateEventArgs allIdleEventArgs = null; lock (syncLock) { if (enableReaderIdle && readerIdleCheckTime <= ticks) { readerIdleEventArgs = firstReaderIdle ? IdleStateEventArgs.FirstReaderIdleStateEvent : IdleStateEventArgs.ReaderIdleStateEvent; firstReaderIdle = false; readerIdleCheckTime = ticks + readerIdleTime.Ticks; } if (enableWriterIdle && writerIdleCheckTime <= ticks) { writerIdleEventArgs = firstWriterIdle ? IdleStateEventArgs.FirstWriterIdleStateEvent : IdleStateEventArgs.WriterIdleStateEvent; firstWriterIdle = false; writerIdleCheckTime = ticks + writerIdleTime.Ticks; } if (enableAllIdle && allIdleCheckTime <= ticks) { allIdleEventArgs = firstAllIdle ? IdleStateEventArgs.FirstAllIdleStateEvent : IdleStateEventArgs.AllIdleStateEvent; firstAllIdle = false; allIdleCheckTime = ticks + allIdleTime.Ticks; } } if (readerIdleEventArgs != null) { RaiseIdleStateChanged(readerIdleEventArgs); } if (writerIdleEventArgs != null) { RaiseIdleStateChanged(writerIdleEventArgs); } if (allIdleEventArgs != null) { RaiseIdleStateChanged(allIdleEventArgs); } } catch (Exception) { } } lock (syncLock) { if (connected) { TimeSpan waitTimeout = TimeSpan.FromTicks(Math.Min(Math.Min(readerIdleCheckTime, writerIdleCheckTime), allIdleCheckTime) - ticks); if (waitTimeout.Ticks > 0) { Monitor.Wait(syncLock, waitTimeout); } } else { Monitor.Wait(syncLock); } } } } catch (Exception) { } }, cancellationToken); }
protected void RaiseIdleStateChanged(IdleStateEventArgs eventArgs) { IdleStateChanged?.Invoke(this, eventArgs); }