public ItemValue[] SyncReadItems(DataSource source, int[] serverIds)
        {
            if (@group == null)
            {
                throw new ObjectDisposedException("Group");
            }
            serverIds.ArgumentNotNull("serverIds");
            if (serverIds.Length == 0)
            {
                return(new ItemValue[0]);
            }

            IntPtr dataPtr;
            IntPtr errorsPtr;

            syncIO.Read(source, (uint)serverIds.Length, serverIds, out dataPtr, out errorsPtr);

            return(ItemValueReader.Read(serverIds.Length, dataPtr, errorsPtr));
        }
            public void OnReadComplete(int transactionId, int groupId, int quality, int error, uint count, int[] clientIds, IntPtr values, short[] qualities, long[] timeStamps, int[] errors)
            {
                if (@group.ClientId != groupId)
                {
                    return;
                }

                var handler = @group.readCompleteHandlers;

                if (handler != null)
                {
                    handler(@group, new DataChangeEventArgs(
                                groupId,
                                transactionId,
                                quality,
                                error,
                                ItemValueReader.Read(clientIds, values, qualities, timeStamps, errors)));
                }
            }