public async Task ReadValiesAsynchronously()
        {
            Uri url = UrlBuilder.Build("Matrikon.OPC.Simulation.1");

            using (var server = new OpcDaServer(url))
            {
                // Connect to the server first.
                server.Connect();

                // Create a group with items.
                OpcDaGroup group = CreateGroupWithItems(server);

                // Read values of items from device asynchronously.
                OpcDaItemValue[] values = await group.ReadAsync(group.Items);

                // Output values
                foreach (OpcDaItemValue value in values)
                {
                    Console.WriteLine("ItemId: {0}; Value: {1}; Quality: {2}; Timestamp: {3}",
                                      value.Item.ItemId, value.Value, value.Quality, value.Timestamp);
                }

                // The output should be like the following:
                //   ItemId: Bucket Brigade.Int4; Value: 0; Quality: Good+Good+NotLimited; Timestamp: 04/18/2016 13:40:57 +03:00
                //   ItemId: Random.Int2; Value: 26500; Quality: Good+Good+NotLimited; Timestamp: 04/18/2016 13:40:57 +03:00

                values.Should().OnlyContain(v => v.Error.Succeeded);
                values.Should().OnlyContain(v => v.Quality.Master == OpcDaQualityMaster.Good);
            }
        }
        public OpcDaItemValue[] readTag(bool _sync = false, Action <OpcDaItemValue[]> _callBack = null)
        {
            //da excecao caso o argumento callback seja nulo com o comando assyncrono
            if ((_sync == false) && (_callBack == null))
            {
                throw(new ArgumentNullException());
            }

            // Create a group with items.
            readingGroup.SyncItems();
            Console.Write("reading group -> ");
            Console.WriteLine(readingGroup);

            Console.WriteLine("lendo");
            //faz leitura das tags
            if (_sync)
            {
                // Read all items of the group synchronously.
                var values = readingGroup.Read(readingGroup.Items, OpcDaDataSource.Device);

                foreach (var val in values)
                {
                    Console.Write(val.Item.ItemId);
                    Console.Write(" -- \t");
                    Console.Write(val.Value);
                    Console.Write(" -- \t\t\t\t");
                    Console.Write((int)val.Quality);
                    Console.Write(" -- \t\t");
                    Console.Write(val.Timestamp);
                    Console.Write(" -- \t\t");
                    Console.WriteLine((int)val.Error);
                }
            }
            else
            {
                void completed(Task <OpcDaItemValue[]> values)
                {/*
                  * //OpcDaItemValue[] values = group.ReadAsync(group.Items);
                  * foreach(OpcDaItemValue val in values.Result)
                  * {
                  *     Console.Write(val.Item.ItemId);
                  *     Console.Write(" -- \t");
                  *     Console.Write(val.Value);
                  *     Console.Write(" -- \t\t\t\t");
                  *     Console.Write((int) val.Quality);
                  *     Console.Write(" -- \t\t");
                  *     Console.Write(val.Timestamp);
                  *     Console.Write(" -- \t\t");
                  *     Console.WriteLine((int) val.Error);
                  * }
                  */
                    //chama o callback definido na funcao
                    _callBack((OpcDaItemValue[])values.Result);
                }

                var readingTask = readingGroup.ReadAsync(readingGroup.Items, this.readingCancelationToken);
                Action <Task <OpcDaItemValue[]> > receiverData = completed;
                readingTask.ContinueWith(receiverData);

                // Read all items of the group asynchronously.
                //OpcDaItemValue[] values = group.ReadAsync(group.Items);

                //foreach(var val in values)
                //{
                //    Console.WriteLine(val);
                //}
            }
            return(null);
        }