代码之家  ›  专栏  ›  技术社区  ›  Shayki Abramczyk Cece Dong - MSFT

WPF应用程序在进程WAITFEXEXIT()时卡住

  •  0
  • Shayki Abramczyk Cece Dong - MSFT  · 技术社区  · 8 年前

    我有一个带有按钮的简单WPF应用程序,当单击按钮时,它调用一个启动process-cmd命令的方法,这个命令可能需要1分钟。问题是,在这个时候(当进程等待退出并得到结果)时,应用程序被卡住。

    我在用户界面中的代码是:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // the method Import take 1 minute
        var result = Helpers.Import();
        if (result)
        {
        MessageBox.Show("Sucess", "Sucess");
        }
        else
        {
        MessageBox.Show("Error", "Error",);
        }
    }
    

    我在提单上的代码是:

    public static bool Import()
    {
        ProcessStartInfo info = new ProcessStartInfo(@"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\witadmin.exe", arguments);
        info.CreateNoWindow = true;
        info.WindowStyle = ProcessWindowStyle.Hidden;
        Process p = Process.Start(info);
        p.WaitForExit();
    
        if (p.ExitCode == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    

    当应用程序等待退出代码时,UI就被卡住了。

    我该怎么解决?

    2 回复  |  直到 7 年前
        1
  •  0
  •   LuFFy Тип Странный    8 年前

    方法 WaitForExit() -gt;指示进程组件等待无限的时间,以便进程和事件处理程序退出。这可能导致应用程序停止响应。

        2
  •  0
  •   Shayki Abramczyk Cece Dong - MSFT    7 年前

    我在like@Sinatr的评论中解决了这个问题,我做了这个方法 Button_Click 异步,并打开一个新任务。

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
       bool result = false;
       await Task.Run(() =>
       {
           import = Helpers.Import();
       });
       if (result)
       {
           MessageBox.Show("Sucess", "Sucess");
       }
       else
       {
           MessageBox.Show("Error", "Error",);
       }
    }