【问题标题】:Executing system command asynchronously without blocking UI and exiting the process forcefully异步执行系统命令,不阻塞UI,强行退出进程
【发布时间】:2012-02-18 14:39:04
【问题描述】:

我有一个 C# 上的 WPF 应用程序,我需要执行一个从不存在的系统命令(因为它在等待您按下 Q)。我想在第一次收到输出后强制退出它,我也不想阻塞 WPF UI,所以我想异步执行此操作(我相信线程会使事情变得更复杂)。

这就是我现在拥有的:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C " + command;
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();

上面的代码有两个问题:它阻塞了 UI 并且它永远不会得到输出(进程不会退出)。

注意:我使用了WaitForExit(),因为在继续之前我需要输出。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:
    1. 使用BackgroundWorker Class 在单独的线程上运行进程。它将防止阻塞 UI。
    2. 看看Process.OutputDataReceived Event,它发生在应用程序写入其重定向的StandardOutput 流时。因此,即使进程没有停止,也可以获取输出。

    【讨论】:

    • 如果使用流程事件,则不需要后台工作人员,因为当您调用 Process.BeginErrorReadLine() 和 Process.BeginOutputReadLine() 时事件会异步发生
    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 2019-10-01
    • 1970-01-01
    • 2011-05-25
    • 2013-05-22
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多