c# - 进程为 WaitForExit() 时 WPF 应用程序卡住
问题描述
我有一个带有按钮的简单 WPF 应用程序,当单击按钮时,它会调用一个启动进程的方法 - 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 卡住了。
我该如何解决?
解决方案
I solved in like @Sinatr's comment, I made the method Button_Click
async, and open a new Task.
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",);
}
}
推荐阅读
- ios - 错误:pod 包:'无法找到'PRIVATE FRAMEWORK' 的规范,这取决于此
- java - Android Studio WebView shouldOverrideUrlLoading Toast 消息未显示
- php - 雄辩的 Laravel 节目试图获取非对象的属性“代码”
- go - hyperleger 结构的 idemix 部分包含两个方法,NewNymSignature 和 NewSignature。有什么区别?
- macos-sierra - 如何在 Mac OS 的 apache2 服务器中安装 lib mod_auth_cas.so
- ios - iOS 上的 OneDrive 应用程序 - 从 PowerApps 启动到特定文件夹
- typescript - 验证 Angular 5 输入字段
- javascript - Web Audio API - 多个同步轨道 - 当新轨道开始时停止前一个轨道
- matlab - 在 Matlab 上绘制欧拉方法
- javascript - onmouseover 不适用于 android 移动设备