2015-09-19 71 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運行在一個單獨的任務。所有這些任務都是獨立的。等待結果就是對它們進行排序。去掉它。