2015-09-19 123 views
3

我正在实施C#应用程序。我需要同时在多个远程计算机上执行程序。为此,我使用PSExec而不是多线程CMD。基本上,对于每台机器,我启动一个启动CMD进程的线程。根据远程执行的程序的结果,如果需要超过x分钟(希望是有道理的),我想要采取行动或杀死它。执行多个CMD任务并异步更新

我有问题是,我真的不知道如何控制多久过程已经比使用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");     
    } 
} 
+0

你正在告诉它等待:'等待结果;'。删除。 – usr

+0

有些事我不明白。这个过程由'WaitForExit'而不是'await result'保存。 WaitForExit存在的原因是检查CMD的进度,看看是否必须杀死进程或认为它已成功完成。我有什么意义吗? – AMs

+0

ExecutePsexec在单独的任务中运行。所有这些任务都是独立的。等待结果就是对它们进行排序。去掉它。 – usr

回答

1

ExecutePsexec运行在一个单独的任务。所有这些任务都是独立的。等待结果就是对它们进行排序。去掉它。