Хобрук: Ваш путь к мастерству в программировании

System.IO.DriveInfo.GetDrives() зависает с отключенными сетевыми дисками

Я пишу файловый менеджер в .NET 3.5. При запуске приложение должно перечислить доступные диски. Для этого я использую DriveInfo.GetDrives.

К сожалению, мои пользователи сетовали на то, что когда они отключали сетевые диски, запуск приложения занимал около 30 секунд.

Я обнаружил, что функция GetDrives() зависает на много секунд при отключенном сетевом диске. И интерфейс зависает. Это происходит при запуске, и каждый раз, когда я подключаю новый диск.

Подводя итог, мне нужен способ перечисления доступных дисков, который возвращается немедленно, даже если есть отключенные сетевые диски. Спасибо за любую помощь.

Дополнительная информация:

  1. Я сделал тест с WMI, и возникает та же проблема. Запрос WMI возвращается примерно через 15 секунд.

  2. Я также рассматривал возможность переноса вызова DriveInfo в отдельный поток. Это решило бы проблему не блокирования пользовательского интерфейса; но это будет означать, что когда пользователь подключает новый диск, значок диска появляется только через 15 секунд. Это не идеально.

Большое спасибо за любую помощь.


  • Я не понимаю, как решение 2 может вызвать 15-секундную задержку для новых дисков. Я предполагаю, что вы снова вызываете GetDrives(), потому что вы не можете получить соответствующую букву диска из своего механизма уведомлений? Если вы это сделаете, вы можете тривиально вычислить новый набор дисков без дорогостоящего вызова GetDrives(). 23.10.2009
  • Именно так: когда пользователь подключает USB-накопитель, я получаю сообщения WM_DEVICECHANGE + DBT_DEVICEARRIVAL, но не вижу, как получить букву только что подключенного диска, поэтому снова вызываю GetDrives(). Вы говорите, что я могу избежать этого, но я не понимаю, как это сделать. Не могли бы вы объяснить? Спасибо 23.10.2009

Ответы:


1

Боюсь, что нет никакого способа избежать блокировки. Это связано с истечением времени ожидания сети/файла в Windows API.

23.10.2009
Новые материалы

Понимание дженериков в TypeScript: подробное руководство
Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

Учебные заметки JavaScript Object Oriented Labs
Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

Разбор строк запроса в vue.js
Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
«Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..