父类中的静态事件处理程序不是从Process触发的.在嵌套类中退出
本文关键字:退出 Process 嵌套 事件处理 静态 程序 父类 | 更新日期: 2023-09-27 18:22:11
每次调用CurlFile()时,都会从ProcessObject类创建一个新对象。ProcessObject对象启动新进程。我希望每个对象中的Process.Exit事件触发父类中的静态事件处理程序,但由于某种原因,它似乎不起作用。
class Curl
{
StringContainer oStrings = new StringContainer();
private static int _counter = 0;
private string _curl;
public Curl()
{
//oStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
_curl = oStrings.Curl;
}
public void CurlFile(string _arg)
{
ProcessObject oProcessObject = new ProcessObject(_arg, _curl);
}
private static void oProcess_Exited(object sender, EventArgs e)
{
_counter++;
if (_counter == 1000)
{
MessageBox.Show("here");
}
}
private class ProcessObject
{
ProcessStartInfo oStartInfo = new ProcessStartInfo();
Process oProcess = new Process();
public ProcessObject(string _arg, string _curl)
{
oStartInfo.FileName = _curl;
oStartInfo.Arguments = _arg;
oProcess.EnableRaisingEvents = true;
oProcess.Exited += new EventHandler(oProcess_Exited);
oProcess = Process.Start(oStartInfo);
}
}
}
首先,正如@Will所提到的,您需要保留对Process对象的引用,这样它们就不会得到GC。类似这样的东西(代码未经测试):
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类在检测Exit方面可能参差不齐。我不知道这是否也适用于Exited事件,但我会注意它,并像上面一样显式设置UseShellExecute = false;
。