Это заменяет процесс, если в словаре найден процесс с таким же идентификатором, и автоматически добавляет новый процесс в противном случае.
dictProcess(process.ProcessId) = process
РЕДАКТИРОВАТЬ (в ответ на ваш отредактированный вопрос):
Я бы изменил имя класса Processes
на Process
, так как он не является коллекцией, но должен представлять один процесс. Вы можете изменить конструктор класса Process
на
Public Sub New(ByVal ProcessId As Integer, ByVal ProcessName As String, ByVal SessionId As Integer)
_ProcessId = ProcessId
_ProcessName = ProcessName
_SessionId = SessionId
End Sub
Затем добавьте метод
Public Sub AddWmiInfo (ByVal PageFileUsage As Integer, ByVal WorkingSetSize As Integer)
_PageFileUsage = PageFileUsage
_WorkingSetSize = WorkingSetSize
End Sub
В качестве альтернативы, вы можете также сделать эти свойства доступными для чтения / записи, однако вы получите более качественную инкапсуляцию, подобную этой.
Добавить основную информацию о процессе в словарь с помощью Cassia. Обратите внимание, что ProcessId
объявлен как Integer
, и поэтому проверка Not String.IsNullOrEmpty(process.ProcessId)
не имеет смысла.
For Each process As ITerminalServicesProcess In server.GetProcesses()
dictprocess.Add( _
process.ProcessId, _
New Process(process.ProcessId, process.ProcessName, process.SessionId))
Next
Наконец, вы бы добавили информацию из WMI следующим образом:
Dim p As Process = Nothing
For Each wmiProcess In prowmi
If dictprocess.TryGetValue(wmiProcess.ProcessID, p) Then
p.AddWmiInfo(wmiProcess.PageFileUsage, wmiProcess.WorkingSetSize)
End If
Next
TryGetValue
возвращает процесс в переменной p
. Второй параметр TryGetValue
является параметром ByRef
.
EDIt # 2:
Ваш цикл должен читать
Dim p As Process = Nothing
For Each user As User In dictuser.Values
If dictprocess.TryGetValue(user.SessionID, p) Then
p.AddUserInfo(user.UserName)
End If
Next
Однако, если вы никогда не получаете доступ к пользовательскому словарю через ключ (идентификатор сеанса), тогда список будет более подходящим, чем словарь.