VB NET Перечисление дисков и VMWARE - PullRequest
1 голос
/ 04 ноября 2008

Это странно ... В приложении Windows Forms (VB.NET/VS 2005) мне нужно время от времени проверять, вставлен ли DVD-диск приложения.
На моем рабочем компьютере (и у большинства наших клиентов) выполнение этого кода занимает менее секунды. Но на некоторых машинах это занимает от 8 до 10 секунд. Я не смог найти точки соприкосновения с теми несколькими устройствами, в которых он работал медленнее (разные ОС, разные ОЗУ, разные процессоры, больше дисков, меньше дисков и т. Д.).
Это происходит примерно на 4% наших тестовых машин (и некоторых наших друзей на данный момент :))
Поскольку эта функция называется только один раз, я могу жить с ней. Но странная вещь, и мы случайно наткнулись на это, заключается в том, что если виртуальная машина VMWare работает, то код (работающий в хост-ОС) займет ожидаемое меньше секунды !!!
Кто-нибудь когда-нибудь сталкивался с чем-то похожим на это? Может кто-нибудь хотя бы предложить какое-нибудь объяснение этому?

i_DrivesArray = GetLogicalDrives()
    i_DrivesCount = i_DrivesArray.Length


    For i_DriveNumber = 0 To i_DrivesCount - 1
        i_DriveInformation = New DriveInfo(i_DrivesArray(i_DriveNumber))

        If (i_DriveInformation.DriveType = i_DriveTargetType And i_DriveInformation.IsReady = True) Then

            If File.Exists(i_DriveInformation.Name.ToString & ci_CDIdentifiers(i_Counter).ToString) = True Then
                ci_IsCDInserted = True
                ci_PathCD = i_DriveInformation.Name.ToString
                Exit For
            End If

        End If
    Next

Ответы [ 2 ]

1 голос
/ 14 января 2009

Где стоимость в этом коде? Профилирование действительно поможет на плохой машине

Я бы предположил, что стоимость этих вызовов DriveInfo где-то есть - глядя в рефлектор на код позади DriveInfo:

.cctor кажется довольно безобидным - просто проверяет буквенные ограничения.

.GetDriveType вызывает прямо в эквивалентный Win32 API. Подозреваю, что это попытается получить доступ к корню каталога, так как один из возможных результатов возврата - DRIVE_NO_ROOT_DIR.

http://msdn.microsoft.com/en-us/library/aa364939.aspx

.IsReady - при попытке «открыть» корневой каталог диска заполняется структура FILE_ATTRIBUTE. Опять же, это похоже на GetDriveType - возможно, дорого.

Оба последних API имеют возможность попробовать коснуться файловой системы диска. С этого момента вы зависите от поведения устройства и его драйверов для тома относительно того, что означает «размонтирован», «готов», «не готов» и т. Д., Например, попытка раскрутить диск.

Поскольку задержки составляют порядка секунд, я в равной степени подозреваю, что перечисление медленных томов дискет / DVD / CD занимает больше всего времени по сравнению с другими типами носителей. У дискет особенно долгое время был тайм-аут.

0 голосов
/ 04 ноября 2008
  • Рассматривали ли вы подключенные к сети диски? Они могут очень медленно отвечать за определенные вещи.

  • Вы пытались получить список дисков, а затем проверять каждый диск параллельно, а не последовательно? Отмените все отложенные запросы, когда результат будет найден, и верните true. Поскольку реальный DVD-привод, вероятно, вернется сразу же, это предотвратит перетаскивание медленных томов на остальные процессы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...