public bool ApplyChanges()
{
lock (m_lock)
{
// add items.
List<ISampledDataChangeMonitoredItem> itemsToSample = new List<ISampledDataChangeMonitoredItem>();
for (int ii = 0; ii < m_itemsToAdd.Count; ii++)
{
ISampledDataChangeMonitoredItem monitoredItem = m_itemsToAdd[ii];
if (!m_items.ContainsKey(monitoredItem.Id))
{
m_items.Add(monitoredItem.Id, monitoredItem);
if (monitoredItem.MonitoringMode != MonitoringMode.Disabled)
{
itemsToSample.Add(monitoredItem);
}
}
}
m_itemsToAdd.Clear();
// collect first sample.
if (itemsToSample.Count > 0)
{
ThreadPool.QueueUserWorkItem(DoSample, itemsToSample);
}
// remove items.
for (int ii = 0; ii < m_itemsToRemove.Count; ii++)
{
m_items.Remove(m_itemsToRemove[ii].Id);
}
m_itemsToRemove.Clear();
// start the group if it is not running.
if (m_items.Count > 0 && m_samplingThread == null)
{
Startup();
}
// stop the group if it is running.
else if (m_items.Count == 0 && m_samplingThread != null)
{
Shutdown();
}
// can be shutdown if no items left.
return m_items.Count == 0;
}
}
#endregion