Имею код
private void MakeDriveList(char driveLetter)
{
List<ListItem> roots = treeListView1.Roots.Cast<ListItem>().ToList();
DriveInfo driveInfo = new DriveInfo(driveLetter.ToString());
ListItem rootListItem = new ListItem(driveInfo.Name, ListItemType.Disk, null);
rootListItem.Size = driveInfo.TotalSize;
rootListItem.DiskInfo.FreeSpace = driveInfo.AvailableFreeSpace;
string displayName = $"{driveInfo.Name} {driveInfo.AvailableFreeSpace} / {driveInfo.TotalSize}";
rootListItem.DisplayName = displayName;
ParseDir(driveInfo.Name, rootListItem);
roots.Add(rootListItem);
treeListView1.UpdateObjects(roots);
dateCreated = DateTime.Now;
lblDateModified.Text = $"Изменён: {dateCreated}";
void ParseDir(string dir, ListItem rootItem)
{
string[] rootDirs = Directory.GetFileSystemEntries(dir).Where(f => Directory.Exists(f)).ToArray();
string[] rootFiles = Directory.GetFileSystemEntries(dir).Where(f => File.Exists(f)).ToArray();
foreach (string subDir in rootDirs)
{
string subDirName = Path.GetFileName(subDir);
ListItem item = new ListItem(subDirName, ListItemType.Directory, rootItem);
try
{
DirectoryInfo directoryInfo = new DirectoryInfo(subDir);
item.DateCreated = directoryInfo.CreationTime;
item.DateModified = directoryInfo.LastWriteTime;
item.AttributesString = AttributesToString(directoryInfo.Attributes);
ParseDir(subDir, item);
}
catch (UnauthorizedAccessException ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
rootItem.Children.Add(item);
}
foreach (string file in rootFiles)
{
string fileName = Path.GetFileName(file);
ListItem item = new ListItem(fileName, ListItemType.File, rootItem);
try
{
FileInfo fileInfo = new FileInfo(file);
item.Size = fileInfo.Length;
item.DateCreated = fileInfo.CreationTime;
item.DateModified = fileInfo.LastWriteTime;
item.AttributesString = AttributesToString(fileInfo.Attributes);
displayName = $"{fileName} [{item.Size}] [{item.AttributesString}]";
item.DisplayName = displayName;
}
catch (UnauthorizedAccessException ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
rootItem.Children.Add(item);
}
}
}
Всё это выводится в TreeListView
.
Если указать диск, содержащий дофига файлов, то появляется вкладка студии Приложение находится в режиме приостановки выполнения
и экскепшен Помощник по отладке управляемого кода "ContextSwitchDeadlock" : "CLR не удалось перейти из COM-контекста 0x7c91e0 в COM-контекст 0x7c9128 за 60 секунд. Наиболее вероятно, что поток, владеющий контекстом/апартаментом назначения, находится в режиме ожидания или выполнения очень длительной операции без прокачки сообщений Windows. Обычно эта ситуация отрицательно влияет на производительность и даже может привести к зависанию приложения или чрезмерному расходованию памяти. Чтобы избежать этой проблемы, все потоки однопоточного апартамента (STA) должны использовать примитивы ожидания для прокачки (например, CoWaitForMultipleHandles) и периодически прокачивать сообщения во время длительных операций."
Чё это значит? Всё же в одном потоке выполняется. Какое ему дело до того, как долго выполняется код?