Pergunta

Este é estranho ... em um aplicativo Windows Forms (vb.net/vs 2005), tenho a necessidade de verificar ocasionalmente se o DVD do aplicativo é inserido.
Na minha máquina de produção (e na maioria de nossos clientes), esse código leva menos de um segundo para executar. Mas em algumas máquinas, leva cerca de 8 a 10 segundos. Não consegui encontrar nenhum terreno comum nos poucos PCs em que era mais lento (sistema operacional diferente, RAM diferente, processadores diferentes, mais unidades, menos unidades, etc.).
Isso acontece em cerca de 4% de nossas máquinas de teste (e algumas de nossas máquinas de amigos, até agora :))
Como essa função é chamada apenas uma vez, posso viver com ela. Mas a coisa estranha, e tropeçamos sobre isso com pura sorte, é que, se uma máquina virtual da VMware estiver em execução, o código (em execução no sistema operacional host) levará o esperado menos de um segundo !!!
Alguém já encontrou algo semelhante a isso? Alguém pode pelo menos oferecer alguma explicação para isso?

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
Foi útil?

Solução

Onde está o custo neste código? O perfil realmente ajudaria em um mau máquina

Eu imagino que o custo esteja em algum lugar daquelas ligações de Driveinfo - olhando no refletor no código por trás de Driveinfo:

.CCtor parece bastante inócuo - apenas valida as restrições de cartas.

.GetDriveType chama diretamente para a API Win32 equivalente. Suspeito que isso tente acessar a raiz do diretório, pois um dos seus possíveis resultados de retorno é drive_no_root_dir.

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

.Isready - que parece tentar "abrir" o diretório raiz da unidade preenchem a estrutura do arquivo_attribute. Novamente, isso se parece com o GetDriveType - possivelmente caro.

Ambas as últimas API têm o potencial de tentar tocar no sistema de arquivos de unidade. A partir daí, você depende do comportamento do dispositivo e são drivers para o volume do que "não montado", "pronto," não pronto "etc. significa. Por exemplo, tentando aumentar um disco.

Como os atrasos estão na ordem dos segundos, suspeito igualmente que a enumeração dos volumes de disquete lento/DVD/CD é o que leva mais tempo em comparação com outros tipos de mídia. Fluppies costumavam ter um tempo limite muito longo.

Outras dicas

  • Você já considerou unidades mapeadas de rede? Eles podem demorar muito a responder por certas coisas.

  • Você já tentou obter a lista de unidades e verificando cada unidade em paralelo e não em série? Cancele quaisquer solicitações pendentes quando um resultado for encontrado e retorne a verdade. Como a unidade de DVD real provavelmente retornará imediatamente, isso impediria que qualquer volume lento arraste o restante dos processos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top