Beispiel #1
0
 protected virtual void OnIdleStateChanged(object sender, IdleStateEventArgs e)
 {
     if (eventArgsSubject != null)
     {
         eventArgsSubject.Publish(e);
     }
 }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 protected void RaiseIdleStateChanged(IdleStateEventArgs eventArgs)
 {
     IdleStateChanged?.Invoke(this, eventArgs);
 }