/// <summary>
 ///     Reads the specified group items using MaxAge. If the information in the cache is within the MaxAge, then the data
 ///     will be obtained from the cache, otherwise the server must access the device for the requested information.
 ///     //In addition, the ability to Read from a group based on a "MaxAge" is provided.
 ///     //from cache or device as determined by "staleness" of cache data
 /// </summary>
 /// <param name="items">The group items.</param>
 /// <param name="maxAge">The MaxAge for all items.</param>
 /// <returns>
 ///     The values of the group items.
 /// </returns>
 public OpcDaItemValue[] ReadMaxAge(IList <OpcDaItem> items, TimeSpan maxAge)
 {
     CheckItems(items);
     CheckSupported(OpcDaGroupFeatures.ReadMaxAge);
     TimeSpan[] maxAges = ArrayHelpers.CreateMaxAges(items.Count, maxAge);
     return(ReadMaxAge(items, maxAges));
 }
 /// <summary>
 ///     Asynchronously reads the specified group items using MaxAge. If the information in the cache is within the MaxAge,
 ///     then the data will be obtained from the cache, otherwise the server must access the device for the requested
 ///     information.
 /// </summary>
 /// <param name="items">The group items.</param>
 /// <param name="maxAge">The MaxAge for all items.</param>
 /// <param name="token">The task cancellation token.</param>
 /// <returns>
 ///     The values of the group items.
 /// </returns>
 public Task <OpcDaItemValue[]> ReadMaxAgeAsync(IList <OpcDaItem> items, TimeSpan maxAge,
                                                CancellationToken token)
 {
     TimeSpan[] maxAges = ArrayHelpers.CreateMaxAges(items.Count, maxAge);
     return(ReadMaxAgeAsync(items, maxAges, token));
 }