public async Task UnSubscribeTest()
        {
            var path = $"/{DateTime.Now:yyyy_MM_dd_HH_mm_ss_ff}";

            var count = 0;

            var waitEvent = new AutoResetEvent(false);
            NodeDataChangeHandler handler = (client, args) =>
            {
                count++;
                waitEvent.Set();
                return(Task.CompletedTask);
            };

            await _client.SubscribeDataChange(path, handler);

            await _client.CreateEphemeralAsync(path, null);

            waitEvent.WaitOne(10000);
            Assert.Equal(1, count);

            _client.UnSubscribeDataChange(path, handler);

            await _client.DeleteAsync(path);

            Assert.Equal(1, count);
        }
        /// <summary>
        /// 监听指定的节点
        /// </summary>
        /// <param name="node">节点名称</param>
        /// <param name="callback">节点数据更改或者节点被删除时会触发该事件</param>
        /// <returns>Task</returns>
        public Task Listen(string node, CacheCallback <string> callback)
        {
            NodeDataChangeHandler handler = null;

            handler = (ct, args) =>
            {
                //节点被删除或者节点数据改动时清理该节点对应的缓存数据
                if (args.Type == Watcher.Event.EventType.NodeDataChanged || args.Type == Watcher.Event.EventType.NodeDeleted)
                {
                    if (callback != null)
                    {
                        callback(args.Path);
                    }
                }
                return(Task.CompletedTask);
            };


            NodeDataChangeHandler handlerLast = null;

            if (_handlerRecord.ContainsKey(node))
            {
                handlerLast = _handlerRecord[node];
            }
            if (handlerLast != null)
            {
                //取消侦听
                _zkClient.UnSubscribeDataChange(node, handlerLast);
            }
            _handlerRecord[node] = handler;
            Task task = _zkClient.SubscribeDataChange(node, handler);

            return(task);
        }
 public Task StopAsync(CancellationToken cancellationToken = default(CancellationToken))
 {
     if (_client != null && !cancellationToken.IsCancellationRequested)
     {
         _client.UnSubscribeDataChange(ListenerPath, (ct, args) => { return(Task.CompletedTask); });
     }
     return(Task.CompletedTask);
 }