void OnCachedNodesChange() { lock (CachedNodes) { NodeInfoForPC[] nodes; nodes = CachedNodes.ToArray(); foreach (var node in nodes) { var cur = RootFS.ClientList.FirstOrDefault(x => {//find by node id if (x.Value is TopFolderClient tpc) { if (tpc.NodeId == node.NodeGuid) { return(true); } } return(false); }); if (cur.Key == null)//not found { InsertRootFS(node); } else { if (cur.Value is TopFolderClient tpc) { if (tpc.TimeStamp >= node.PCTimeStamp) { continue; } var origname = tpc.Name; tpc.hostUri = new Uri(node.Url); tpc.Name = node.Name; tpc.NodeId = node.NodeGuid; tpc.TimeStamp = node.PCTimeStamp; if (origname != node.Name) { InsertRootFS(node, tpc); RootFS.ClientList.TryRemove(origname, out _); } else {// do nothing } } } } var lis = RootFS.ClientList.Where(x => { if (x.Value is TopFolderClient tpc) { lock (CachedNodes) { return(CachedNodes.FirstOrDefault(y => y.NodeGuid == tpc.NodeId) == null); } } return(false); }).ToList(); foreach (var item in lis) { RootFS.ClientList.TryRemove(item.Key, out _); } } }