Во-первых, как упоминает @Will, вам нужно сохранить ссылку на ваши объекты Process, чтобы они не получали GC'd. Примерно так (код не проверен):
class Curl
{
internal static List<ProcessObject> _processes = new List<ProcessObject>();
// ....
private static void oProcess_Exited(object sender, EventArgs e)
{
var p = sender as Process;
if (p != null && _processes.Contains(p))
_processes.Remove(p);
_counter++;
if (_counter == 1000)
{
MessageBox.Show("here");
}
}
public ProcessObject(string _arg, string _curl)
{
oStartInfo.FileName = _curl;
oStartInfo.Arguments = _arg;
oStartInfo.UseShellExecute = false;
oProcess.EnableRaisingEvents = true;
oProcess.Exited += new EventHandler(oProcess_Exited);
oProcess = Process.Start(oStartInfo);
Curl._processes.Add(oProcess);
}
}
Кроме того, так как некоторые люди нашли , класс Process может не заметить обнаружение выхода. Я не знаю, верно ли это и для события Exited, но я бы остерегался этого и явно устанавливал UseShellExecute = false;
, как и выше.