C#异步运行多个process.Start()

时间:2019-03-25 17:06:49

标签: c# asynchronous task process.start

我有一个包含多个PCL文件的文件夹,这些文件需要转换为PDF。我能够使用第三方exe实现此目的。为了加快速度,我尝试运行多个Tasks(),每个Tasks使用exe启动一个新的System.Diagnostics.Process;

System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo.FileName = $@".\WinPCLtoPDF\WinPCLtoPDF.exe";
            process.StartInfo.Arguments = $@"{StepParameters["StagingFileName"]} {StepParameters["StagingFileName"]}.pdf batch";
            process.Start();
            process.WaitForExit();

任务被添加到List<Task>中,并且在程序退出之前等待每个任务。

            foreach (FileInfo fileInfo in files)
            {
                tasks.Add(ProcessDocumentTaskAsync(batchType, fileInfo, deleteOriginalFile));

                while (tasks.Count < files.Count() && tasks.Where(x => !x.IsCompleted).Count() > concurrentTasks)
                {
                    Thread.Sleep(50);
                }
            }

使用此类方法创建任务。

        private async static Task ProcessDocumentTaskAsync(BatchType batchType, FileInfo fileInfo, bool deleteOriginalFile)
        {
            await Task.Run(() =>
            {   
                ProcessParameters processParameters = ProcessParams();/////get process params            
                DocumentProcessor documentProcessor = GetDocumentProcessor(batchType, processParameters);
                using (documentProcessor)
                {
                    documentProcessor.ProcessDocument();
                }
            });
        }

此模式适用于其他任务,您可以从日志文件中看到作业正在异步执行。但是,使用此WinPCLtoPDF.exe,似乎一次只能处理一个文件,但是任务管理器显示正在运行多个进程。例如,进程1和2将等待,而3开始并结束,并被4、5等取代,直到最后整个文件夹都处于进程状态,然后1到2完成。

我可以找出为什么1和2似乎被阻止并且不能快速完成,从而允许其他任务开始吗?

1 个答案:

答案 0 :(得分:0)

最简单的解决方案可能是(如评论中所述)使用Parallel.ForEach。在您的情况下,它将类似于:

        Parallel.ForEach(files, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, fileInfo =>
        {
            ProcessParameters processParameters = ProcessParams();/////get process params            
            DocumentProcessor documentProcessor = GetDocumentProcessor(batchType, processParameters);
            using (documentProcessor)
            {
                documentProcessor.ProcessDocument();
            }
        });

请注意以下事项:

之所以无法一次运行所有任务,可能是因为您正在等待ProcessDocumentTaskAsync函数中的任务完成。