等待进程退出时阻止事件
本文关键字:事件 进程 退出 等待 | 更新日期: 2023-09-27 18:32:51
我有一个Windows C#应用程序app1,我在其中启动另一个应用程序app2,通过单击一个按钮,带有:
var myProc = Process.Start("app2.exe", myArgs);
myProc.WaitForExit();//to wait I finish with app2.exe
这很好用,但是打开app2时我有两个问题:
- 如果我单击任务栏中的 app1 图标,app1 会转到前面,这是正常的,而 app2 会转到后台。
- 如果我单击 app1 中的按钮,则在 app2 完成后执行相应的操作。因此,app1 将我单击的按钮保留在内存中,并在之后执行所有操作。
那么即使我点击了 app2 图标,如何让 app2 保持在前面(我不确定是否有可能,因为 app1 和 app2 是完全不同的应用程序)?
对我来说更重要的是,当打开 app1 时,如何使 app2 不响应/保留在内存中事件?
一种解决方案是禁用第一个应用程序的所有窗口,只要子进程正在运行。此外,您可以将应用程序的主窗口设置为子应用程序打开的窗口的所有者(如果子应用程序显示任何窗口)。
如果您提供有关您正在使用的技术的更多详细信息,我们可以提供进一步的帮助。
您可以使用
`myProcess.windowstyle`
设置以最小化启动您的 app2,或者如果我没记错的话,甚至是隐藏的processWindowStyle.Hidden
.
您还可以
使用 myForm.Topmost = true;
若要确保应用不再响应按钮的使用,可以禁用按钮
myButton.Enabled = false;
在启动应用程序 2 之前,并在您的之后重新启用它们 myProcess.WaitForExit()
方法。
按照 Dirk Vollmar 的建议禁用表单,但也使用 async/await 和 Task.Run() 在队列被禁用时抽取队列。 这将导致应用在禁用表单时丢弃所有用户输入,而不是在再次启用表单后对其进行排队和处理:
private async void button1_Click(object sender, EventArgs e)
{
this.Enabled = false;
await Task.Run(() =>
{
var myProc = Process.Start("calc");
myProc.WaitForExit();
});
this.Enabled = true;
}
您必须在另一个任务中创建它
app1.WindowState = FormWindowState.Minimized;
Task t = YourProcess();
t.Wait();
app1.WindowState = FormWindowState.Maximized;
您的任务
private Task YourProcess()
{
return Task.Run(() => {
var myProc = Process.Start("app2.exe", myArgs);
myProc.WaitForExit();
});
}