private void DoSample(object state)
{
try
{
lock (Lock)
{
for (int ii = 0; ii < m_sampledItems.Count; ii++)
{
MonitoredItem monitoredItem = m_sampledItems[ii];
// get the handle.
NodeHandle handle = monitoredItem.ManagerHandle as NodeHandle;
if (handle == null)
{
continue;
}
// check if it is time to sample.
if (monitoredItem.TimeToNextSample > m_minimumSamplingInterval)
{
continue;
}
// read the value.
DataValue value = new DataValue();
ServiceResult error = handle.Node.ReadAttribute(
SystemContext,
monitoredItem.AttributeId,
monitoredItem.IndexRange,
monitoredItem.DataEncoding,
value);
if (ServiceResult.IsBad(error))
{
value = new DataValue(error.StatusCode);
}
value.ServerTimestamp = DateTime.UtcNow;
// queue the value.
monitoredItem.QueueValue(value, error);
}
}
}
catch (Exception e)
{
Utils.Trace(e, "Unexpected error during diagnostics scan.");
}
}
#endregion