From 5855ff0d27b8c162356ca7d83aa68d5098037501 Mon Sep 17 00:00:00 2001 From: qianlifeng Date: Tue, 4 Nov 2014 18:21:07 +0800 Subject: [PATCH] Fix errors that collections has been changed while foreach collections --- .../MFTSearch/MFTSearcherCache.cs | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/Plugins/Wox.Plugin.FindFile/MFTSearch/MFTSearcherCache.cs b/Plugins/Wox.Plugin.FindFile/MFTSearch/MFTSearcherCache.cs index 5353573366..e60e558d4d 100644 --- a/Plugins/Wox.Plugin.FindFile/MFTSearch/MFTSearcherCache.cs +++ b/Plugins/Wox.Plugin.FindFile/MFTSearch/MFTSearcherCache.cs @@ -7,6 +7,7 @@ namespace Wox.Plugin.FindFile.MFTSearch internal class MFTSearcherCache { public Dictionary> VolumeRecords = new Dictionary>(); + public static object locker = new object(); public MFTSearcherCache() { } @@ -26,7 +27,10 @@ namespace Wox.Plugin.FindFile.MFTSearch EnsureVolumeExistInHashTable(volume); if (!VolumeRecords[volume].ContainsKey(record.FRN)) { - VolumeRecords[volume].Add(record.FRN, record); + lock (locker) + { + VolumeRecords[volume].Add(record.FRN, record); + } } } @@ -47,7 +51,10 @@ namespace Wox.Plugin.FindFile.MFTSearch { if (hashtable.ContainsKey(volume) && hashtable[volume].ContainsKey(frn)) { - hashtable[volume].Remove(frn); + lock (locker) + { + hashtable[volume].Remove(frn); + } return true; } else @@ -65,7 +72,10 @@ namespace Wox.Plugin.FindFile.MFTSearch { if (source.ContainsKey(volume) && source[volume].ContainsKey(record.FRN)) { - source[volume][record.FRN] = record; + lock (locker) + { + source[volume][record.FRN] = record; + } return true; } else @@ -77,20 +87,21 @@ namespace Wox.Plugin.FindFile.MFTSearch public List FindByName(string filename, long maxResult = -1) { List result = new List(); - - foreach (Dictionary dictionary in VolumeRecords.Values) + lock (locker) { - foreach (var usnRecord in dictionary) + foreach (Dictionary dictionary in VolumeRecords.Values) { - if (usnRecord.Value.Name.IndexOf(filename, StringComparison.OrdinalIgnoreCase) >= 0) + foreach (var usnRecord in dictionary) { - result.Add(usnRecord.Value); + if (usnRecord.Value.Name.IndexOf(filename, StringComparison.OrdinalIgnoreCase) >= 0) + { + result.Add(usnRecord.Value); + if (maxResult > 0 && result.Count() >= maxResult) break; + } if (maxResult > 0 && result.Count() >= maxResult) break; } - if (maxResult > 0 && result.Count() >= maxResult) break; } } - return result; }