以串联和并联方式启动过程

时间:2011-12-05 05:48:22

标签: wpf process dispatcher series processstartinfo

我这里有问题.....

我有一个ProcessStartInfo列表为List<ProcessStartInfo>

我想在Series启动流程,即

如果我启动第一个流程,那么列表中的第二个流程应该仅在第一个流程(退出或中止)时启动...

我试着像......

    private void startSeriesExecution()
    {
        List<string> programpath = new List<string>();
        programpath.Add(@"C:\Program Files\Internet Explorer\iexplore.exe");
        programpath.Add(@"C:\Program Files\Microsoft Office\Office12\WINWORD.EXE");

        foreach (var VARIABLE in programpath)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo
                                             {
                                                 FileName = VARIABLE,
                                                 Arguments =
                                                     "www.google.com"
                                             };

            try
            {
                using (Process process=Process.Start(startInfo))
                {
                    if (process.WaitForExit(Int32.MaxValue))
                    {
                        continue;
                    }
                }
            }
            catch (Exception)
            {
                continue;
            }
        }
    }

我正在使用自定义类进行多线程运行startSeriesExecution所有进程同时执行....

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // This function starts the Execution in different thread
        Start.Work(startSeriesExecution).OnComplete(onSeriesExecutionComplete).Run();
    }

我还观察了一件事......

如果1进程已在运行...让我们说IE已经运行了,现在我执行startSeriesExecution()并在此启动已经运行的进程(IE)...然后执行整个for循环..即,列表中的所有进程都被执行......

现在不知道要继续......

1 个答案:

答案 0 :(得分:0)

该代码看起来会起作用。 WaitForExit将暂停该线程,直到完成。

此外,如果这些过程输出大量信息,那么您需要添加

process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived);
process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);

无论哪个都是个好主意,否则进程可能会挂起,直到输出和错误字段被清除,这可能永远不会发生。

将事件添加到流程将使它们保持输出,因此不会堵塞它。

更新:

如果您想检查某个流程是否已在运行,您可以这样做:stackoverflow.com/a/51149/540339

然后你必须使用Thread.Sleep(xxxx)循环并等待,直到该进程关闭。