Opc.Ua.Server.SamplingGroup.SampleMonitoredItems C# (CSharp) Method

SampleMonitoredItems() private method

Periodically checks if the sessions have timed out.
private SampleMonitoredItems ( object data ) : void
data object
return void
        private void SampleMonitoredItems(object data)
        {
            try
            {
                //Utils.Trace("Server: {0} Thread Started.", Thread.CurrentThread.Name);

                int sleepCycle = Convert.ToInt32(data, CultureInfo.InvariantCulture);
                int timeToWait = sleepCycle;

                while (m_server.IsRunning)
                {
                    DateTime start = DateTime.UtcNow;

                    // wait till next sample.
                    if (m_shutdownEvent.WaitOne(timeToWait, false))
                    {
                        break;
                    }

                    // get current list of items to sample.
                    List<ISampledDataChangeMonitoredItem> items = new List<ISampledDataChangeMonitoredItem>();

                    lock (m_lock)
                    {
                        // check if halted.
                        if (m_samplingThread == null)
                        {
                            break;
                        }

                        uint disabledItemCount = 0;
                        Dictionary<uint,ISampledDataChangeMonitoredItem>.Enumerator enumerator = m_items.GetEnumerator();

                        while (enumerator.MoveNext())
                        {
                            ISampledDataChangeMonitoredItem monitoredItem = enumerator.Current.Value;
                            
                            if (monitoredItem.MonitoringMode == MonitoringMode.Disabled)
                            {
                                disabledItemCount++;
                                continue;
                            }

                            // check whether the item should be sampled.
                            //if (!monitoredItem.SamplingIntervalExpired())
                            //{
                            //    continue;
                            //}

                            items.Add(monitoredItem);   
                        }
                    }

                    // sample the values.
                    DoSample(items);

                    int delay = (int)(DateTime.UtcNow - start).TotalMilliseconds;
                    timeToWait = sleepCycle;

                    if (delay > sleepCycle)
                    {
                        timeToWait = 2*sleepCycle - delay;

                        if (timeToWait < 0)
                        {
                            Utils.Trace("WARNING: SamplingGroup cannot sample fast enough. TimeToSample={0}ms, SamplingInterval={1}ms", delay, sleepCycle);
                            timeToWait = sleepCycle;
                        }
                    }
                }
                
                //Utils.Trace("Server: {0} Thread Exited Normally.", Thread.CurrentThread.Name);
            }
            catch (Exception e)
            {
                Utils.Trace(e, "Server: {0} Thread Exited Unexpectedly.", Thread.CurrentThread.Name);
            }
        }