gpt4 book ai didi

c# - Windows Form 在不阻塞 UI 的情况下运行外部进程

转载 作者:行者123 更新时间:2023-11-30 19:25:59 26 4
gpt4 key购买 nike

我想:

  1. 显示带有文本框的表单。
  2. 运行外部程序(为了便于举例,notepad.exe)。
  3. 继续允许用户在记事本运行时将数据输入到表单文本框中。
  4. 在记事本关闭时运行更多(继续)原生表单代码。这将更新表单等。

我在实现这一点时遇到了问题。我知道有很多关于这个类似问题的帖子,但还没有找到适合我的解决方案。

我试过:

  • 执行 waitforexit,但这当然会阻塞 UI,用户无法输入数据。
  • 尝试异步流程调用,在此流程完成时调用另一个方法。这会导致从另一个线程调用新方法并且无法更新表单的问题。
  • 在 UI 中执行等待/ sleep 循环,但这同样会自然地阻塞 UI。

对于简单的 Windows 窗体 程序,最简洁、最简单的解决方案是什么?没有使用额外的类,所有代码都在 Form1 类中。

最佳答案

Process 类在进程退出时触发 Exited 事件。您可以向该事件添加处理程序以在进程退出时执行代码而不阻塞 UI 线程:

process.EnableRaisingEvents = true;
process.Exited += (s, args) => DoStuff();

或者,您可以创建一个 Task 来表示利用 TPL 实现异步的过程的完成:

public static Task WhenExited(this Process process)
{
var tcs = new TaskCompletionSource<bool>();
process.EnableRaisingEvents = true;
process.Exited += (s, args) => tcs.TrySetResult(true);
return tcs.Task;
}

这将允许你写:

await process.WhenExited();
UpdateUI();

关于c# - Windows Form 在不阻塞 UI 的情况下运行外部进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25768984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com