C# 如何在运行进程时保持父窗体处于活动状态?

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

你好,在我的主窗体中,我正在运行一个命令行exe来为我做一些事情。唯一的问题是,当它正在做它需要做的事情时,我的父窗体被完全冻结,直到过程结束

是否有任何方法可以运行该流程,同时保持我的父窗体不冻结,以便可以单击按钮等?谢谢,我在下面提供了运行该流程的代码

        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
关键字添加到该事件中,如答案所示。很抱歉,响应太晚,非常感谢大家