2013-06-06 5 views
24

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

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

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

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

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

+0

рефлекторное время? –

ответ

23

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

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

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

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


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

+1

Мне понравилось бы использовать (IEnumerable ...) 'здесь :) – eFloh

+2

@eFloh - не уверен, что вы на это нацеливаетесь. В выражении 'using' вводится новая переменная и область, в которой эта переменная будет использоваться. Таким образом, хотя «использование» может использоваться только для одноразовых объектов, точка почти всегда должна использовать их «небезопасные» аспекты в пределах этой области. –

+0

просто хороший syntaqx shortener ... В частности, для этих случаев, когда у вас есть целый список одноразовых, было бы неплохо иметь синтаксис, чтобы окончательно избавить их от необходимости, а не 'finally {foreach (... x. ..) {x.Dispose(); }} ' – eFloh

1

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

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

Смежные вопросы