2013-08-05 21 views
0

我在Visual Studio 2010,C#(.Net 4)上工作。如何在旧的进程完成后运行新进程,而不挂起应用程序

我有一个包含两列DataGridView的应用程序。每列包含我想运行的程序的参数。

现在我想从我的C#应用​​程序运行另一个应用程序与参数从数据网格视图。 另外,我想在运行新程序前等待3秒钟。

我尝试后续代码,而是一个过程后平行,而不是一个运行:

private static Mutex mut = new Mutex(); 

public void runProgram(string executablePath, string argu1, string argu2) 
{ 
    mut.WaitOne(); 

    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.WorkingDirectory = Path.GetDirectoryName(executablePath); 
    startInfo.FileName = "CMD.exe"; 
    startInfo.Arguments = "/C " + set.ExecutablePath + " " 
          + argu1 + " " + argu2; 

    try 
    { 
     Process p = Process.Start(startInfo); 
     //p.WaitForExit(); // don't start the next process until the first finish -> not good, stuck the app 
    } 
    catch 
    { 
     MessageBox.Show("ERROR: unsuccess to run the applicition"); 
    } 

    mut.ReleaseMutex(); 
} 

private void bu_RunProgram_Click(object sender, EventArgs e) 
{ 
    if (!File.Exists(set.ExecutablePath)) 
    { 
     MessageBox.Show("The executable file doesn't exist\nPlease select right executable file in the settings form", "Error"); 
     return; 
    } 

    int progRow; 
    foreach (DataGridViewRow dgvr in dg_ParametersToRun.Rows) 
    { 
     progRow = dgvr.Index; 
     string argu1 = dg_ParametersToRun.Rows[progRow].Cells[0].FormattedValue.ToString(); 
     string argu2 = dg_ParametersToRun.Rows[progRow].Cells[1].FormattedValue.ToString(); 

     Thread threadProgRun= new Thread(() => runProgram(set.ExecutablePath, argu1, argu2)); 
     threadProgRun.Start(); 

     Thread.Sleep(3000); // Need to come to this line only when the previous thread finish... 
    } 
} 

说实话,我从来没有使用线程的工作..

谢谢!

更新代码(按照建议):

// Aid variable 
int paramRowIndex; 

public void runNextParameters(object sender, EventArgs e) 
{ 
    paramRowIndex++; 
    if (paramRowIndex > dg_RunListTests.Rows.Count) return; finish run all parameters 

      //run the test 
    string argu1 = dg_RunListTests.Rows[paramRowIndex].Cells[0].FormattedValue.ToString(); 
    string argu2 = dg_RunListTests.Rows[paramRowIndex].Cells[1].FormattedValue.ToString(); 
    runParameters(set.ExecutablePath, componenet, test); 
} 

public void runParameters(string executablePath, string argu1, string argu2) 
{ 
    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.WorkingDirectory = Path.GetDirectoryName(executablePath); 
    startInfo.FileName = "CMD.exe"; 
    startInfo.Arguments = "/C " + set.ExecutablePath + " " 
         + argu1 + " " + argu2; 
    try 
    { 
     Process p = Process.Start(startInfo); 
     p.Exited += runNextParameters; 
    } 
    catch 
    { 
     MessageBox.Show("Unsuccess to run the test again"); 
    } 
} 

private void bu_RunParameters_Click(object sender, EventArgs e) 
{ 
    if (!File.Exists(set.ExecutablePath)) 
    { 
     MessageBox.Show("The executable file doesn't exist\nPlease select right  executable file in the settings form", Error); 
     return; 
    } 

    paramRowIndex = 0; 
    runNextParameters(sender, e); 
} 
+0

在你的循环中填充List <>。使用Process.Exited事件来遍历列表。 –

+0

谢谢!我还没有尝试,但它确实很好看! – AsfK

+0

@HansPassant:我尝试过,但它对我不起作用。尽管我添加了Process.Exited事件,但它并未进入...我根据您的建议更新了我的问题。 还有一个:我如何在这种方式之间进行延期? 谢谢 – AsfK

回答

0

可能快速的解决方案:启动启动二(三)程序.bat文件。您必须创建另一个等待3秒钟的程序来调用它们。

相关问题