Приложение C#, которое я разработал, записывает 300 небольших (1k) файлов в локальную файловую систему (NTFS). В течение этого времени explorer.exe использует до 100% процессорного времени.Собственная программа записывает 300 небольших файлов. За это время explorer.exe затрачивает почти 100% процессорное время
Вещь, которые я уже разобрался:
- Убедившись, что нет проводниковой окна открыты отображениями целевой папки
- Исключены индексирование для целевой папки
- Expluded индексирование для этого полного привода
- Остановился и отключены службы «Поиск Windows» (SearchIndexer.exe)
Все это без эффекта.
Когда я использую Systinternals ProcessExplorer я вижу один занят нить explorer.exe, что государства большую часть времени:
ntdll.dll!RtIFreeUnicodeString+0x1370
И его стек выглядеть следующим образом:
0 msvcrt.dll!memcpy+0x8a
1 SHELL32.dll!Ordinal755+0x75c
2 SHELL32.dll!PathYetAnotherMakeUniqueName+0x35316
3 SHELL32.dll!ExtractIconExW+0xed8
4 SHELL32.dll!ExtractIconW+0x98e5
5 SHELL32.dll!SHChangeNotification_Lock+0x4179
6 SHELL32.dll!DAD_SetDragImage+0x1018
7 SHELL32.dll!DAD_SetDragImage+0x11ef
8 SHCORE.dll!GetProcessReference+0x3f
9 ntdll.dll!RtlDestroyHeap+0x317
10 ntdll.dll!RtlFreeUnicodeString+0x17d5
11 KERNEL32.DLL!BaseThreadInitThunk+0xd
12 ntdll.dll!RtlUserThreadStart+0x34
Что исследователь. exe здесь? Есть ли прямая зависимость между файловой системой и проводником? И как я могу предотвратить такое поведение?
Там нет UI нить. Написание происходит в собственном потоке. Однако проблема также проявляется в соответствующем UnitTest, который только что сгенерировал все эти файлы. – Seven
Вы можете использовать такой инструмент, как [Process Explorer] (https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx), чтобы узнайте, что на самом деле делают самые загруженные потоки Explorer.exe. –
@Axel Kemper: Я добавляю некоторый вывод ProcessExplorer. В позиции 5 он говорит «SHChangeNotification_Lock». Исследователь уведомляет некоторые процессы о каждом новом файле? – Seven