在等待进程退出时阻止事件

时间:2014-12-02 11:47:22

标签: c# events process wait exit

我有一个Windows C#应用程序app1,我通过单击按钮启动另一个应用程序app2,其中包含:

var myProc = Process.Start("app2.exe", myArgs);
myProc.WaitForExit();//to wait I finish with app2.exe

这很有效,但在app2打开时我有两个问题:

  1. 如果我点击任务栏中的app1图标,app1会转到正常位置,而app2会显示背景。
  2. 如果我点击了app1中的按钮,则app2完成后会执行相应的操作。因此,app1将我点击的按钮保留在内存中,然后执行所有操作。
  3. 那么如何将app2保持在前面,即使我点击了app1图标(我不确定它是否可能因为app1和app2是完全不同的应用程序)?

    对我来说更重要的是如何在app2打开时让app1不响应/保留内存事件?

4 个答案:

答案 0 :(得分:0)

一种解决方案是禁用第一个应用程序的所有窗口,只要子进程正在运行即可。此外,您可以将应用程序的主窗口设置为子应用程序打开的窗口的所有者(子应用程序是否应显示任何窗口)。

如果您提供有关所用技术的更多详细信息,我们可以提供进一步的帮助。

答案 1 :(得分:0)

你可以使用

 `myProcess.windowstyle` 

将app2设置为最小化,或者即使隐藏processWindowStyle.Hidden也没有错误。

您还可以使用

将app1置于顶部

myForm.Topmost = true;

为了确保您的应用不再响应按钮的使用,您可以禁用按钮

myButton.Enabled = false;

在您启动应用2之前,并在您的应用之后重新启用它们 myProcess.WaitForExit() 方法

答案 2 :(得分:0)

根据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;
    }

答案 3 :(得分:0)

您必须在另一个任务中创建它

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();
    });    
}