Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 进程为WaitForExit()时WPF应用程序卡住_C#_Wpf - Fatal编程技术网

C# 进程为WaitForExit()时WPF应用程序卡住

C# 进程为WaitForExit()时WPF应用程序卡住,c#,wpf,C#,Wpf,我有一个简单的WPF应用程序,它有一个按钮,当按钮点击它调用一个启动process-cmd命令的方法时,cmd命令可能需要1分钟。问题是,此时(当进程等待退出并获得结果时),应用程序被卡住了 我在UI中的代码是: private void Button_Click(object sender, RoutedEventArgs e) { // the method Import take 1 minute var result = Helpers.Import(); if

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

我在UI中的代码是:

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",);
    }
}
我在BL中的代码是:

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被卡住


如何解决它?

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

我在like@Sinatr的评论中解决了这个问题,我让方法
按钮\u单击
异步,然后打开一个新任务

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",);
   }
}

UI线程中的Do't call
WaitForExit
可能重复。您可以创建一个新任务并等待它。考虑添加更多代码(理想地),这样某人就可以快速地使它异步。@ FAKECALEB我尝试了答案,但是没有成功,我给问题添加了更多的代码。我建议您用这些答案的尝试实现更新您的问题,以查看问题我知道WaitForExit()可能是原因,但我需要使用它,因为我需要ExitCode,我需要一种使用它的方法,并且仍然不会被卡住。好的,在您从ExitCode获得值后,您是否正在关闭流程?调用Close()当关联进程终止时。关闭分配给退出进程的可用内存。