C# 如何在某个进程运行时将程序发送到后台
我有一个程序可以启动另一个程序(iexplore.exe),然后我的程序应该“不可见”或至少到后台,并在这个asd.exe运行时保持在那里。这段代码正在工作,但它消耗内存,有时它只是在asd.exe不再运行时保持隐藏。必须有一种更有效的方法来做到这一点=) 所以我的程序代码:C# 如何在某个进程运行时将程序发送到后台,c#,multithreading,process,wait,C#,Multithreading,Process,Wait,我有一个程序可以启动另一个程序(iexplore.exe),然后我的程序应该“不可见”或至少到后台,并在这个asd.exe运行时保持在那里。这段代码正在工作,但它消耗内存,有时它只是在asd.exe不再运行时保持隐藏。必须有一种更有效的方法来做到这一点=) 所以我的程序代码: this.Hide(); Process.Start(Path.Combine(Path, "iexplore.exe")); Process[] Running_ = null; do {
this.Hide();
Process.Start(Path.Combine(Path, "iexplore.exe"));
Process[] Running_ = null;
do
{ // this loops eats memory!
System.Threading.Thread.Sleep(500);
Running_ = null;
Running_ = Process.GetProcessesByName("iexplore");
}while (Running_.Length > 0);
this.Show();
您需要对数组中的每个对象调用
Dispose()
,然后它停止运行以消耗内存
我的意思是,而不是WoWRunning_uz=null代码>放在那里类似于foreach(WoWRunning_uu中的进程p)p.Dispose()代码>
但是无论如何,您的算法应该完全修改,这是非常昂贵的,因为您一次又一次地加载一个包含所有进程的数组。您需要对数组中的每个对象调用Dispose()
,然后它停止消耗内存
我的意思是,而不是WoWRunning_uz=null代码>放在那里类似于foreach(WoWRunning_uu中的进程p)p.Dispose()代码>
但无论如何,您的算法应该完全修改,这是相当昂贵的,因为您一次又一次地加载所有进程的数组。
- 无需将WOWRUNING设置为null。Process.getProcessByName无论如何都会更改引用
- Call.Dispose()李>
- 无需将WOWRUNING设置为null。Process.getProcessByName无论如何都会更改引用
- Call.Dispose()李>
Process.WaitForExit方法如何
this.Hide();
Process p = Process.Start(Path.Combine(WoWPath, "asd.exe"));
p.WaitForExit();
this.Show();
那么Process.WaitForExit方法呢
this.Hide();
Process p = Process.Start(Path.Combine(WoWPath, "asd.exe"));
p.WaitForExit();
this.Show();
我喜欢MatthiasG所做的,但是WaitForExit()是一个阻塞调用……在asd.exe完成执行之前,您的程序将被隐藏,但您的程序将不会执行任何有效率的操作
这可能是期望的结果。如果不是,我会的
- 隐藏表单->
this.Hide()代码>
- 创建一个线程(BackgroundWorker就足够了)。。。在DoWork()事件中,为asd创建流程对象(如MatthiasG所做的):
- 在RunWorkerCompleted事件中,have
this.Show()代码>
我喜欢MatthiasG所做的,但是WaitForExit()是一个阻塞调用……在asd.exe完成执行之前,您的程序将被隐藏,但您的程序将不会执行任何有效率的操作
这可能是期望的结果。如果不是,我会的
- 隐藏表单->
this.Hide()代码>
- 创建一个线程(BackgroundWorker就足够了)。。。在DoWork()事件中,为asd创建流程对象(如MatthiasG所做的):
- 在RunWorkerCompleted事件中,have
this.Show()代码>
您需要使用进程。此处的Exit事件可防止阻塞UI线程并避免线程之间的冲突。像这样:
private void button1_Click(object sender, EventArgs e) {
var prc = new Process();
prc.EnableRaisingEvents = true;
prc.Exited += processExited;
prc.StartInfo = new ProcessStartInfo("notepad.exe");
prc.Start();
this.Hide();
}
private void processExited(object sender, EventArgs e) {
this.BeginInvoke(new Action(() => {
this.Show();
this.BringToFront();
}));
}
您需要使用进程。此处的Exit事件可防止阻塞UI线程并避免线程之间的冲突。像这样:
private void button1_Click(object sender, EventArgs e) {
var prc = new Process();
prc.EnableRaisingEvents = true;
prc.Exited += processExited;
prc.StartInfo = new ProcessStartInfo("notepad.exe");
prc.Start();
this.Hide();
}
private void processExited(object sender, EventArgs e) {
this.BeginInvoke(new Action(() => {
this.Show();
this.BringToFront();
}));
}
阻止UI线程是不合法的。对窗口管理器来说非常不健康。你完全正确。我只是想展示一种比galaris的代码更简单的方法来实现相同的(甚至更少的错误)结果。如果我使用它,我会在自己的线程中执行它,而不是在UI线程中。阻止UI线程是不合法的。对窗口管理器来说非常不健康。你完全正确。我只是想展示一种比galaris的代码更简单的方法来实现相同的(甚至更少的错误)结果。如果我使用这个,我会在自己的线程中执行它,而不是在UI线程中。我同意。当使用Process.WaitForExit方法或任何其他线程阻塞操作时,使用BackgroundWorker(或新线程)是必不可少的。感谢您的解决方案,但我认为Hans Passant提供了一种更有效的方法。无论如何,谢谢你的帮助。对我来说,这是两种不同的方式。Hans展示的是Process类有一个名为Exited的内置事件。这是有效的,当它被提升时,你可以做任何你想做的事。我的解决方案要求一个单独的线程使用它自己的事件来做完全相同的事情。他们都使用事件。实际上,这一切都是关于您希望如何完成解决方案。汉斯的解决方案可能看起来更干净,这绝对是我学到的新东西!我同意。当使用Process.WaitForExit方法或任何其他线程阻塞操作时,使用BackgroundWorker(或新线程)是必不可少的。感谢您的解决方案,但我认为Hans Passant提供了一种更有效的方法。无论如何,谢谢你的帮助。对我来说,这是两种不同的方式。Hans展示的是Process类有一个名为Exited的内置事件。这是有效的,当它被提升时,你可以做任何你想做的事。我的解决方案要求一个单独的线程使用它自己的事件来做完全相同的事情。他们都使用事件。实际上,这一切都是关于您希望如何完成解决方案。汉斯的解决方案可能看起来更干净,这绝对是我学到的新东西!谢谢,现在我知道如何处理这些事情了。谢谢,现在我知道如何处理这些事情了。从未使用过退出的事件。如果它像广告宣传的那样工作,那肯定很棒!从未使用退出的事件。如果它像广告宣传的那样工作,那肯定很棒!