Мне кажется, что вам нужно собрать результаты из вашего рабочего потока.Может быть, вы могли бы заставить событие ProgressChanged возвращать коллекцию результатов прогресса или что-то в этом роде?Или только событие срабатывает не чаще, чем каждые полсекунды с последними данными.Я подозреваю, что проблема в том, что вы просто пытаетесь добавить данные слишком быстро.Вам нужно делать меньше единиц работы с большим количеством работы в каждой единице (добавить множество строк за один раз).
Бабар прав.Что-то вроде этого, вероятно, будет делать то, что вы хотите (я не пытался скомпилировать):
public void GetFileList(ref List<FileInfo> fList, string fPath, BackgroundWorker scanner)
{
DirectoryInfo di = new DirectoryInfo(fPath);
FileInfo[] fi = di.GetFiles();
List<string> progressData = new List<string>();
foreach (FileInfo fiTemp in fi)
{
//ar ~$ saakas nevajadzigie temp faili, tos izlaižam
if (fiTemp.Name.StartsWith("~$") == false)
{
fList.Add(fiTemp);
progressData.Add(fiTemp.Name);
if (progressData.Count > 50){
scanner.ReportProgress(0, progressData.ToArray());
progressData.Clear();//You've just copied the data to an array and sent it to the GUI, clear the list and start counting up again
}
}
}
if (progressData.Count > 0){
scanner.ReportProgress(0, progressData.ToArray());
}
DirectoryInfo[] dFolders = di.GetDirectories();
//katrai apakšmapei rekursivi izsaucam šo funkciju
foreach (DirectoryInfo d in dFolders)
{
GetFileList(ref fList, d.FullName, scanner);
}
}
Это не очень хорошее решение, но это начало ...
Вынужно будет также привести e.UserState к строковому массиву в вашем обратном вызове ...