private void RefreshTimer_Tick(object sender, EventArgs e) { try { // mark current list items to remove foreach (var item in ProcessListView.Items.Cast<ProcessItem>()) item.Purge = true; string pipePath = @"\\.\pipe\"; String[] pipes = Directory.GetFiles(pipePath) .Where(p => p.StartsWith(pipePath + "xray_")) .ToArray(); foreach (var pipe in pipes) { var host = pipe.Replace(pipePath, ""); string url = "ipc://" + host + "/query"; var item = ProcessListView.Items.Cast<ProcessItem>().FirstOrDefault(p => p.Url == url); if (item == null) { item = new ProcessItem(url); ProcessListView.Items.Add(item); } item.Update(); item.Purge = false; } var removeItems = ProcessListView.Items.Cast<ProcessItem>().Where(p => p.Purge).ToArray(); foreach (var item in removeItems) ProcessListView.Items.Remove(item); LastErrorLabel.Text = ""; } catch (Exception ex) { LastErrorLabel.Text = "Monitor Error: " + ex.Message; } }