1

这是一个奇怪的... 在 Windows 窗体应用程序 (VB.NET/VS 2005) 中,我需要偶尔检查是否插入了应用程序 DVD。
在我的生产机器(以及我们的大多数客户)中,这段代码的执行时间不到一秒。但在某些机器中,大约需要 8 到 10 秒。我在那些速度较慢的几台电脑上找不到任何共同点(不同的操作系统、不同的 RAM、不同的处理器、更多的驱动器、更少的驱动器等)。
它发生在我们大约 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
4

2 回答 2

1

这段代码的成本在哪里?分析对机器真的很有帮助

我想成本在那些 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 卷的枚举花费的时间最多。软盘特别是曾经有很长的超时。

于 2009-01-14T01:58:21.237 回答
0
  • 您是否考虑过网络映射驱动器?他们对某些事情的反应可能很慢。

  • 您是否尝试过获取驱动器列表,然后并行而不是串行地检查每个驱动器?找到结果时取消任何待处理的请求并返回 true。由于真正的 dvd 驱动器可能会立即返回,这将防止任何缓慢的卷拖累其余进程。

于 2008-11-04T16:49:32.057 回答