private async Task Loop(ZooKeeper keeper, ZookeeperPathString path)
        {
            var data = await keeper.getDataAsync(path, true);

            var sValue = Source.DataEncoding.GetString(data.Data);

            Data.TryAdd(path.ToKeyString(), sValue);

            if (data.Stat.getNumChildren() > 0)
            {
                var childs = await keeper.getChildrenAsync(path, true);

                foreach (var c in childs.Children)
                {
                    await Loop(keeper, path + c);
                }
            }
        }
        private async Task OnKeyChanged(WatchedEvent args)
        {
            var eventType            = args.get_Type();
            ZookeeperPathString path = args.getPath();
            var        key           = path.ToKeyString();
            string     value;
            DataResult result;

            switch (eventType)
            {
            case Watcher.Event.EventType.None:
                break;

            case Watcher.Event.EventType.NodeCreated:
                result = await _client.getDataAsync(path);

                value = Source.DataEncoding.GetString(result.Data);
                Data.TryAdd(key, value);
                break;

            case Watcher.Event.EventType.NodeDeleted:
                Data.Remove(key);
                break;

            case Watcher.Event.EventType.NodeDataChanged:
                result = await _client.getDataAsync(path);

                value     = Source.DataEncoding.GetString(result.Data);
                Data[key] = value;
                break;

            // ignore nochild changed every node was be watched
            case Watcher.Event.EventType.NodeChildrenChanged:
            default:
                break;
            }
        }