Итак, мое приложение выполняет итерацию по системным службам и получает о них различную информацию. Одним из них является PID, для получения которого я использую следующий код (добавьте одну кнопку и ссылку на System.Management):
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim myStopWatch As New Stopwatch
myStopWatch.Start()
Dim processId As UInteger = 0
Dim strService As String = "BITS"
Dim qry As String = "SELECT PROCESSID FROM WIN32_SERVICE WHERE NAME = '" & strService & "'"
Dim searcher As System.Management.ManagementObjectSearcher = New System.Management.ManagementObjectSearcher(qry)
For Each mngntObj As System.Management.ManagementObject In searcher.[Get]()
processId = CUInt(mngntObj("PROCESSID"))
Next
myStopWatch.Stop()
MessageBox.Show("ID: " & processId.ToString & vbNewLine & myStopWatch.ElapsedMilliseconds.ToString)
End Sub
Теперь у меня это как собственная функция в моем основном приложении, а не на кнопке (только для целей тестирования).
Все это работает, и я могу пройти через службы все нормально. Мне просто любопытно, можно ли это еще оптимизировать? Для получения PID требуется около 17-20 мс, но в зависимости от того, сколько сервисов запущено, может сложиться до пары секунд.
Мне любопытно, можно ли как-нибудь оптимизировать этот запрос? Спасибо.
Кому интересно, я получил этот бит кода из этого сообщения msdn.
@ Кен Уайт: Спасибо, это все, что мне нужно было знать. Новичок в WMI, поэтому не был уверен, что еще можно было сделать.
Вы можете попробовать использовать функции API службы, как описано в ответе на: Как мы можем найти идентификатор процесса работающей службы Windows?.
@TnTinMn: Спасибо за подсказку!
1. В обычных сценариях вы должны обеспечить выход из цикла, чтобы избежать повторения более одного элемента (например, нескольких экземпляров программ). 2. Существуют некоторые свойства класса System.Management.EnumerationOptions, которые можно настроить, чтобы попытаться оптимизировать время выполнения запроса WMI: ReturnImmediately = True; Rewindable = False; DirectRead = True и EnumerateDeep = False; вы можете передать его конструктору ManagementObjectSearcher.
Это время, о котором вы сообщаете, очень велико. Запрос о состоянии всех служб не должен занимать более 200–300 миллисекунд на локальном компьютере. Как сказал @ElektroStudios, вы, вероятно, захотите пропустить глубокое перечисление и запросить зависимости суперкласса службы в последующем запросе (как это делает Консоль управления). Другое дело, если запрос выполняется на удаленном компьютере.
@ElektroStudios: Спасибо! Я не знал, что эти варианты существуют, но все еще учился, как их обойти.
@Jimi Вау, не знал, что это должно быть так быстро. Да, я постараюсь это изменить. Спасибо!
См .: System.Management.EnumerationOptions, System.Management.Scope и System.Management.ConnectionOptions. Если возникнут проблемы, оставьте комментарий.





Нет, если вы не убедите MS улучшить производительность WMI. Ваш код не содержит ничего, что можно было бы оптимизировать, потому что его производительность полностью зависит от скорости работы WMI.