c# 运行 多个 process.Start() 异步
c# running multiple process.Start() asynchronously
我有一个文件夹,其中包含多个需要转换为 PDF 的 PCL 文件。我可以使用第三方 exe 来实现这一点。为了加快速度,我正在尝试 运行 多个 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,它似乎一次只处理一个文件,但任务管理器却显示有多个进程 运行ning。例如,进程 1 和 2 将等待,而 3 开始和完成并被 4、5 等替换,直到最后整个文件夹都在处理,然后 1 然后 2 完成。
我能找出为什么 1 和 2 似乎被阻止并且没有快速完成,从而允许其他任务开始吗?
最简单的解决方案可能是(如评论中所述)使用 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
函数中的任务完成。
我有一个文件夹,其中包含多个需要转换为 PDF 的 PCL 文件。我可以使用第三方 exe 来实现这一点。为了加快速度,我正在尝试 运行 多个 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,它似乎一次只处理一个文件,但任务管理器却显示有多个进程 运行ning。例如,进程 1 和 2 将等待,而 3 开始和完成并被 4、5 等替换,直到最后整个文件夹都在处理,然后 1 然后 2 完成。
我能找出为什么 1 和 2 似乎被阻止并且没有快速完成,从而允许其他任务开始吗?
最简单的解决方案可能是(如评论中所述)使用 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
函数中的任务完成。