执行多个CMD任务并异步更新
本文关键字:异步 更新 任务 CMD 执行 | 更新日期: 2023-09-27 18:13:30
我正在实现一个c#应用程序。我需要在多台远程机器上同时执行一个程序。为此,我在多线程的CMD
上使用PSExec
。基本上,对于每台机器,我启动一个启动CMD
进程的线程。根据远程执行的程序的结果,如果需要超过x分钟,我想要么采取行动,要么杀死它(希望这是有意义的)。
我得到的问题是,我真的不知道如何控制进程已经运行了多长时间,而不是使用WaitForExit
,这并没有真正让我去多线程,因为它等待直到CMD
调用已经完成。
我相信一定有办法做到这一点,但我真的想不出来。有人能帮帮我吗?
这是我的代码(我是c#编码的新手,所以可能不是最好的代码,随时纠正你认为不正确的任何部分):
public async void BulkExecution()
{
//Some code
foreach (string machine in Machines)
{
//more code to work out the CMDline and other duties.
var result = Task.Factory.StartNew(r => ExecutePsexec((string)r, RunBeforeKillMsec), CMDLine);
await result;
}
//More Code
}
private static void ExecutePsexec(string CMDline, int RunBeforeKillMsec)
{
Process compiler = new Process();
compiler.StartInfo.FileName = "psexec.exe";
compiler.StartInfo.Arguments = CMDline;
compiler.StartInfo.UseShellExecute = false;
compiler.StartInfo.RedirectStandardOutput = true;
compiler.Start();
if (!compiler.WaitForExit(RunBeforeKillMsec))
{
ExecutePSKill(CMDline);
}
else
{
//Some Actions here
Common.Log(LogFile, CMDline.Split(' ')[0] + " finished successfully");
}
}
ExecutePsexec
在一个单独的任务中运行。所有这些任务都是独立的。await result;
是它们的序列。你需要删除它
应该避免使用Async void方法。您应该更改BulkExecution
方法的签名以返回Task
,以便您可以await
它并处理可能发生的任何异常。在该方法中,为每台机器创建一个Task
,然后使用Task.WhenAll
方法等待所有任务:
public async Task BulkExecution()
{
//Some code
Task[] tasks = Machines.Select(machine =>
{
//more code to work out the CMDline and other duties.
return Task.Run(r => ExecutePsexec(CMDLine, ExecutionTimeoutMsec));
}).ToArray();
await Task.WhenAll(tasks);
//More Code
}