Подтвердить что ты не робот

Что делает Process.Dispose() на самом деле?

В С# class Process наследуется от class Component, который реализует IDisposable, и поэтому я могу вызвать Dispose() для любого объекта Process. Неужели мне это нужно? Как узнать, действительно ли мне нужно?

Предположим, что у меня есть следующий код:

 var allProcesses = System.Diagnostics.Process.GetProcesses();
 var processesNames = processes.Select( p => p.ProcessName );
 // output process names here

Теперь похоже, что у меня есть массив объектов Process, и у меня есть craft try-finally для перемещения массива и Dispose() к каждому объекту. Это определенно много дополнительного кода.

Что делает Dispose() для объектов Process? Мне действительно нужно Dispose() каждый объект Process и как я могу решить, нужно ли мне это делать?

4b9b3361

Ответ 1

Мне действительно нужно Dispose() каждый объект Process и как я могу решить, нужно ли мне это делать?

Да, вы должны их уничтожить. Обратите внимание на этот текст в документации для Process:

Системный процесс уникально идентифицируется в системе по его идентификатору процесса. Как и многие ресурсы Windows, процесс также идентифицируется его дескриптором, который может быть не уникальным на компьютере. Ручка - это общий термин для идентификатора ресурса. Операционная система продолжает обрабатывать дескриптор процесса, доступ к которому осуществляется через свойство Handle компонента Process, даже когда процесс вышел. Таким образом, вы можете получить административную информацию процесса, такую ​​как ExitCode (обычно либо нуль для успеха, либо ненулевой код ошибки) и ExitTime. Ручки являются чрезвычайно ценным ресурсом, поэтому утечка ручек более вирулентна, чем утечка памяти.

Итак, если вы не Dispose их, вы потенциально пропустите ручки (пока они не будут собраны мусором), но вся точка Dispose должна позволить раннюю очистку ресурсов)


Обратите также внимание на то, что в той же документации указано, что Process переопределяет Dispose(bool) - еще один ключ, который на самом деле что-то делает, когда вызывается Dispose.

Ответ 2

из MSDN: http://msdn.microsoft.com/en-us/library/3cc9y48w(v=vs.80).aspx

Вызовите Dispose, когда вы закончите использовать компонент. Метод Dispose оставляет компонент в непригодном для использования состоянии. После вызова Dispose вы должны освободить все ссылки на компонент, чтобы сборщик мусора мог вернуть память, занимаемую компонентом.