C# 如何在运行进程时保持父窗体处于活动状态?
你好,在我的主窗体中,我正在运行一个命令行exe来为我做一些事情。唯一的问题是,当它正在做它需要做的事情时,我的父窗体被完全冻结,直到过程结束 是否有任何方法可以运行该流程,同时保持我的父窗体不冻结,以便可以单击按钮等?谢谢,我在下面提供了运行该流程的代码C# 如何在运行进程时保持父窗体处于活动状态?,c#,winforms,async-await,command-line-interface,C#,Winforms,Async Await,Command Line Interface,你好,在我的主窗体中,我正在运行一个命令行exe来为我做一些事情。唯一的问题是,当它正在做它需要做的事情时,我的父窗体被完全冻结,直到过程结束 是否有任何方法可以运行该流程,同时保持我的父窗体不冻结,以便可以单击按钮等?谢谢,我在下面提供了运行该流程的代码 Process newprocess = new Process(); ProcessStartInfo startInfo = new ProcessStartInfo(); startInf
Process newprocess = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.FileName = @"C:\tool.exe";
startInfo.Arguments = "Some Arguments";
newprocess.StartInfo = startInfo;
newprocess.Start();
newprocess.WaitForExit();
将问题中的代码放入一个名为say
RunProcessAndWait()
的方法中,然后在事件处理程序中调用Task.Run(()=>RunProcessAndWait())代码>
如果需要在事件中执行UI操作,则在流程完成后,请使用异步:
private async void OnSomethingPressed(...)
{
await Task.Run(() => RunProcessAndWait());
// Do UI (or other) things here
}
如果您希望使等待更为真正异步(此处可能不需要,但为了完整性,它将为您节省一个线程一段时间),那么问题有一个答案,说明如何做到这一点。只需将其推到后台线程。使用后台工作线程或TimerSee的另一种方法:。注意:等待事物解除冻结UI。请参阅@sellotape的答案。过程可以是事件驱动的。您实际上不需要任何任务
使其异步。如果您需要处理从它运行的程序收到的结果,并且处理需要很长时间,则情况就不同了。然后你需要一个任务
。如果可能的话,我可以根据我的代码得到这个代码的示例吗?我刚刚开始学习c#,虽然那页内容丰富,但我不知道如何在代码中使用我的代码。感谢you@smal:将问题中的代码放在private void RunProcessAndWait(){
和}
之间。然后调用此处显示的方法。@smal请注意,OnSomethingPressed
是一个事件处理程序(例如,按钮单击事件),您必须手动将async
关键字添加到该事件中,如答案所示。很抱歉,响应太晚,非常感谢大家