private void _UnvalidateTimer_Tick(Object sender, EventArgs e) {
this._UnvalidateTimer.Stop();
if (this.CurrentFolder == null) return;
try {
while (_ItemsQueue.Count() > 0) {
var obj = _ItemsQueue.Dequeue();
if (obj.Item1 == ItemUpdateType.RecycleBin) {
this.RaiseRecycleBinUpdated();
}
if (obj.Item1 == ItemUpdateType.Deleted) {
//var worker = new Thread(() => {
//var itemForDelete = this.Items.ToArray().SingleOrDefault(s =>
// s.Equals(obj.Item2) || (
// obj.Item2.Extension.Equals(".library-ms") &&
// s.ParsingName.Equals(Path.Combine(KnownFolders.Libraries.ParsingName,
// Path.GetFileName(obj.Item2.ParsingName)))
// )
//);
//if (itemForDelete != null) {
Items.Remove(obj.Item2);
this._AddedItems.Remove(obj.Item2.PIDL);
//TODO: Make this to work in threaded environment
//itemForDelete.Dispose();
//}
obj.Item2.Dispose();
//this.Invoke((Action)(this.ResortListViewItems));
//});
//worker.SetApartmentState(ApartmentState.STA);
//worker.Start();
} else if (obj.Item1 == ItemUpdateType.Created) {
if (obj.Item2.IsInCurrentFolder(this.CurrentFolder) && !this.Items.Contains(obj.Item2, new ShellItemEqualityComparer())) {
obj.Item2.ItemIndex = this.Items.Count;
this.Items.Add(obj.Item2);
this._AddedItems.Add(obj.Item2.PIDL);
}
} else if (obj.Item1 != ItemUpdateType.RecycleBin) {
var existingItem = this.Items.FirstOrDefault(s => s.Equals(obj.Item2));
if (existingItem == null) {
if (obj.Item2.ParsingName.StartsWith(this.CurrentFolder.ParsingName)) {
if (!this.Items.Contains(obj.Item2, new ShellItemEqualityComparer()) &&
!String.IsNullOrEmpty(obj.Item2.ParsingName)) {
obj.Item2.ItemIndex = this.Items.Count;
this.Items.Add(obj.Item2);
this._AddedItems.Add(obj.Item2.PIDL);
}
} else {
var affectedItem = this.Items.FirstOrDefault(s => s.Equals(obj.Item2.Parent));
if (affectedItem != null) {
var index = affectedItem.ItemIndex;
this.RefreshItem(index, true);
}
}
} else {
if (this.IconSize == 16)
this.SmallImageList.EnqueueOverlay(existingItem.ItemIndex);
else
this.LargeImageList.EnqueueOverlay(existingItem.ItemIndex);
this.RefreshItem(existingItem.ItemIndex, true);
}
//this.ResortListViewItems();
} else {
continue;
}
}
foreach (var path in this._TemporaryFiles.ToArray()) {
var item = this.Items.ToArray().SingleOrDefault(s => s.ParsingName.ToLower().Equals(path.ToLower()));
if (item?.IsFolder == false && !File.Exists(path))
this.Items.Remove(item);
}
////if (this.Items.Count != this.CurrentFolder.Count()) {
//var maintenanceThread = new Thread(() => {
// var deletedItems = this.Items.ToArray().Where(p => !this.CurrentFolder.Any(p2 => p2.Equals(p)));
// foreach (var deletedItem in deletedItems) {
// Items.Remove(deletedItem);
// //this._AddedItems.Remove(deletedItem.PIDL);
// //deletedItem.Dispose();
// }
// this.Invoke((Action) (() => {
// this.ResortListViewItems();
// }));
//});
//maintenanceThread.Start();
//}
this.ResortListViewItems();
this.ItemUpdated?.Invoke(this, new ItemUpdatedEventArgs(ItemUpdateType.Created, null, null, -1));
} catch (Exception) {
}
Shell32.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
}