private void btnSearchKey_Click(object sender, EventArgs e) { if (RedisClient == null) { DoConnection(); } try { this.treeKeys.Nodes.Clear(); System.Threading.EventWaitHandle waitHandle = new System.Threading.EventWaitHandle(false, System.Threading.EventResetMode.AutoReset); List <string> keys = null; new Task(() => { keys = RedisClient.SearchKeys(txtPattern.Text); waitHandle.Set(); }).Start(); if (!waitHandle.WaitOne(RedisClient.SendTimeout)) { RedisClient.Dispose(); RedisClient = null; throw new Exception("search keys timeout!"); } NestedHash keysTree = new NestedHash(); foreach (string key in keys) { string[] keySegments = key.Split(':'); NestedHash pHash = keysTree; // 指针 string pKeySegment = ""; // 指针 for (int i = 0; i < keySegments.Length; i++) { string keySegment = keySegments[i]; if (i > 0) { if (pHash[pKeySegment] == null) { NestedHash hash = new NestedHash(); pHash[pKeySegment] = hash; pHash = hash; } else { pHash = pHash[pKeySegment] as NestedHash; } } if (!pHash.ContainsKey(keySegment)) { pHash.Add(keySegment, null); } pKeySegment = keySegment; } } BuildTree(this.treeKeys.Nodes, keysTree); } catch (Exception ex) { MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void BuildTree(TreeNodeCollection treeNodes, NestedHash nestedHash) { foreach (var item in nestedHash) { TreeNode treeNode = treeNodes.Add(item.Key); NestedHash hash = item.Value as NestedHash; if (hash != null) { BuildTree(treeNode.Nodes, hash); } } }