gpt4 book ai didi

C# 并行运行多个非阻塞外部程序

转载 作者:太空宇宙 更新时间:2023-11-03 20:34:27 25 4
gpt4 key购买 nike

我需要从我的应用程序运行多个外部可执行文件实例。该可执行文件的平均运行时间约为 3 分钟。我想重定向这些进程的输出,并更新我的 GUI 中的进度条。当然,我不想等他们回来才能继续使用我的应用程序。

我想我应该为每个实例创建一个线程,并在线程完成时更新我的​​进度条。

这是正确的方法吗?

此外,您是否推荐了一个很好的资源/文档来了解它是如何工作的?我找到了 http://www.dotnetperls.com/threadpool仅。

编辑:这些过程是基于网络的,即:运行时间可能因链接延迟/带宽而有很大差异。

关于进度条,我想在每次进程完成时更新它。有处理程序吗?稍后我将根据流程输出添加更详细的更新,以增加每个执行步骤的完成进度。

编辑2:

感谢您的投入。因为我可能需要运行很多进程(最多 20 个),而且我不想使带宽饱和,所以我最多并行运行 5 个进程。每次一个进程完成时,我都会增加进度计数器(对于我的进度条),然后运行另一个直到它们全部完成,使用:

Process p = new Process();
p.StartInfo.FileName = pathToApp;
p.EnableRaisingEvents = true;
p.Exited += OnCalibrationProcessExited;
p.Start();

private void OnCalibrationProcessExited(object sender, EventArgs e)
{
runAnotherOne function
}

这是正确的还是有更优雅的方法来实现这一点?当然,我不希望我的应用程序在执行过程中被阻止。为此使用后台工作人员更好吗?

最佳答案

你应该使用 ProcessProcessStartInfo .您需要将 ProcessStartInfo.UseShellExecute 设置为 false,将 ErrorDialog 设置为 falseRedirectStandardOutputtrue(也可能是 RedirectStandardError)。

您还需要为 Process 对象提供委托(delegate),以处理外部进程通过 OutputDataReceived(也可能是 ErrorDataReceived)生成的输出。

还有一个 Exited 委托(delegate),您可以设置它在进程退出时调用。

例子:

ProcessStartInfo processInfo = new ProcessStartInfo("Write500Lines.exe");
processInfo.ErrorDialog = false;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardOutput = true;
processInfo.RedirectStandardError = true;

Process proc = Process.Start(processInfo);
proc.ErrorDataReceived += (sender, errorLine) => { if (errorLine.Data != null) Trace.WriteLine(errorLine.Data); };
proc.OutputDataReceived += (sender, outputLine) => { if (outputLine.Data != null) Trace.WriteLine(outputLine.Data); };
proc.BeginErrorReadLine();
proc.BeginOutputReadLine();

proc.WaitForExit();

关于C# 并行运行多个非阻塞外部程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5693191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com