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

2023-11-30

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

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

这是正确的做法吗?

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

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

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

edit 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
}

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


你应该使用Process and ProcessStartInfo。 你需要设置ProcessStartInfo.UseShellExecute to false, ErrorDialog to false, RedirectStandardOutput to true(并且可能RedirectStandardError too).

您还需要向 Process 对象提供委托,以处理外部进程生成的输出OutputDataReceived(并且可能ErrorDataReceived以及)。

还有一个Exited您可以设置当进程退出时将调用的委托。

Example:

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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 并行运行多个非阻塞外部程序 的相关文章

  • boost::interprocess 准备好迎接黄金时间了吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发一个由内存映射文件支持的线
  • C++ 有像 Pascal 一样的“with”关键字吗?

    withPascal 中的关键字可用于快速访问记录的字段 有人知道 C 是否有类似的东西吗 前任 我有一个包含许多字段的指针 但我不想这样输入 if pointer gt field1 pointer gt field2 pointer g
  • 此插件导致 Outlook 启动缓慢

    我正在使用 C NET 4 5 开发 Outlook Addin 项目 但部署后 有时 Outlook 会禁用我的插件 并显示此消息 这个插件导致 Outlook 启动缓慢 我不知道我的插件出了什么问题 这只有很少的代码 并且ThisAdd
  • 浏览器收集哪些值作为回发数据?

    当页面被发送回服务器时 浏览器收集每个控件的当前值并将其粘贴到一个字符串中 然后 该回发数据通过 HTTP POST 发送回服务器 Q1 除了控件的 Text 属性和 SelectedIndexchanged 因此除了用户输入数据 之外 控
  • 如何检查 .NET 4.0 中的泛型参数是否是动态的

    我有课ObjectMapper
  • C++:获取注册表值仅给出第一个字符[重复]

    这个问题在这里已经有答案了 我试图从注册表中获取字符串值 但我只得到第一个字母 HKEY hKey char gamePath MAX PATH if RegOpenKeyEx HKEY CURRENT USER L Software Bl
  • Thread.interrupt() 和 Thread.interrupted() 到底是如何工作的? [复制]

    这个问题在这里已经有答案了 从设置线程状态的角度来看 我不清楚这两种方法 Java 文档说 Thread interrupt 设置线程中断状态标志 调用 Thread interrupted 方法给出线程的状态并清除该标志 当这在实际场景中
  • 禁用除滚动之外的 DataGridView

    我如何配置 datagridview 以便用户只能在行中移动并使用滚动 而没有其他 如果我禁用网格不允许我使用滚动 将您的 datagridview 设置为只读 这将禁用任何编辑 dataGridView1 ReadOnly true 在你
  • TestMethod:异步任务 TestSth() 不适用于 .NET 4.0

    我正在尝试使用 NET 4 0 BCL Async 和 MsTest 运行异步测试方法 看来这个设置不能处理 测试方法 异步Task测试Sth 由于测试用例资源管理器中缺少条目 将签名更改为异步后void 我可以运行测试用例 但结果错误 根
  • 如何在 C++ 的子目录中创建文件?

    这是我的代码 如何在子目录联系人中创建文件 每次创建该文件时 它都会出现在与我的程序相同的目录中 int main ofstream myfile contacts myfile open a myfile close 在构造函数中指定完整
  • 未定义异常变量时通过引用捕获

    捕获异常时 标准指导是按值抛出 按引用捕获 据我了解 这有两个原因 如果由于内存不足异常而引发异常 我们将不会调用可能终止程序的复制构造函数 如果异常是继承层次结构的一部分 我们可能会对异常进行对象切片 如果我们有一个场景 我们没有在 ca
  • Type_traits *_v 变量模板实用程序顺序无法编译

    看过了这个答案 https stackoverflow com a 31763111 7151494 我试图想出一个变量模板从中获取代码的实用程序 template
  • IClaimsTransformation 未触发

    我尝试过实施一个IClaimsTransformation我在 ASP NET CORE 3 1 Web 应用程序中找到的类 public class ClaimsTransformer IClaimsTransformation publ
  • 为什么在 .net 中使用 Invoke on Controls? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 NET不允许跨线程操作 https stackoverflow com questions 2896504 why net does not allow cross thread operat
  • Wpf DataGrid通过DataBinding隐藏完整行

    是否有可能通过数据绑定隐藏 DataGrid 行 如果我有一个具有可见性属性的 BO 或 ViewModel 项目 是否可以声明一个绑定 以便在该属性设置为不可见时该行将被隐藏 反之亦然 应该可以通过RowStyle 像这样的东西
  • 为什么我的 ITexthandler 不工作?我正在尝试将 XML 解析为 ITextSharp 文档

    我正在使用 Visual Developer 2010 MVC 3 c 我正在尝试将 XML 解析为 iTextSharp 文档 如下所示 ITextHandler textHandler new ITextHandler doc text
  • 向每个收件人发送一封包含不同内容的电子邮件(使用抄送字段)

    在你因为这个问题 毫无意义 和 不可能 而驳回之前 请听我说完 问题 我们在使用我们的系统发送的每封电子邮件中实施跟踪像素 即具有唯一 URL 的可下载 GIF 文件 这有助于我们跟踪电子邮件的打开情况 问题是 当我们抄送一些收件人时 跟踪
  • Intel 和 AMD 处理器有相同的汇编程序吗?

    C语言被用来编写Unix以实现可移植性 使用不同编译器编译的同一个C语言程序会产生不同的机器指令 为什么 Windows 操作系统能够在两者上运行Intel https en wikipedia org wiki Intel and AMD
  • C 中的静态和动态绑定(严格来说是 C,而不是 C++)是什么?

    我最初对发布这个问题感到担忧 以免它重复 但即使在谷歌搜索了许多关键字之后 我在 StackOverflow 上找不到任何解释 C 的静态和动态绑定的链接 尽管有 C 的问题和答案 但是都涉及classes以及显然不适合 C 的东西 Sta
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函

随机推荐

  • 数组初始化的差异

    在查看源文件时 我看到了两种数组初始化的方法 我想知道之间有什么区别 int value new int 0 and int value next new int 其实没有什么区别 它是Syntactic sugar在java数组声明中 第
  • PHP正则表达式最后一次出现的单词

    我的字符串是 var www domain com public html foo bar folder another 我想从此字符串中删除根文件夹 以仅获取公共文件夹 因为某些服务器内部有多个网站 我的实际正则表达式是 www publ
  • 将文本与 a 标签的底部对齐

    如何将文本置于 li 内的 a 标签的底部 这是我的代码 div ul li a href ter a li li a href redg a li li a href ryer More a li li a href More a li
  • VSCode 中多命令的快捷方式

    我有一个现有的快捷方式可以最大化终端窗口 key ctrl command workbench action toggleMaximizedPanel 我想在快捷方式中添加一个附加命令 以便在终端窗口最大化时将焦点转移到终端窗口 在最小化时
  • 测试两个函数变量是否指向同一个函数?

    如何测试两个函数变量是否指向同一个函数 test lm test2 lm test lm error comparison 1 is possible only for atomic and list types test test2 er
  • MVC 剃刀@foreach

    我听说在视图中使用 foreach 是禁忌 意思是 视图中不应该有任何逻辑 foreach 的逻辑应该位于何处的最佳实践是什么 foreach foreach 的逻辑应该位于何处的最佳实践是什么 无处可去 只能摆脱它 您可以使用编辑器或显示
  • BlackBerry - 如何在 Android 中传递 Intent.putExtra() 等数据

    我是黑莓手机的新手 我如何实现 在黑莓手机中 与 Android 相同的功能 intent putExtra key value 将可以接收到的值放在下一个推屏在黑莓手机中 就像在 Android 中一样ActivityOne Intent
  • 有没有办法访问iphone/ipad(真机,无模拟器)中的文档文件夹?

    有没有办法访问真实设备 iphone ipad 文档文件夹 我意识到一个应用程序在该文件夹中存储了一些数据 我想检查一切是否都以正确的方式进行 即使文件位于沙盒中文档之外的其他位置 您也可以在没有 iTunes 的情况下执行此操作 转到 X
  • “出于安全原因,proc_open() 已被禁用”- PHP 错误

    出于安全原因 proc open 已被禁用 我目前使用免费托管 Hostinger 制作一个仅供我和其他人使用的个人网站 我知道我应该删除proc open来自php ini但由于我的共享托管计划 我无法访问它 周围的代码proc open
  • 为什么 Inno Setup 忽略 DefaultDirName

    运行 Inno Setup 5 5 6 我更正了我的错误默认目录名值 但无论我做什么 程序都会继续尝试安装在旧的错误位置 即使我将其设置为与示例之一匹配的值 DefaultDirName pf My Program 程序继续选择旧的 不正确
  • 当我编译这段代码时发生错误C6308,说realloc可以返回NULL,并且可能导致内存泄漏

    void inf int Sub const char num const unsigned int index if this gt length lt index this gt digits char realloc this gt
  • 结构体变量初始化

    我尝试按如下方式初始化结构变量 struct Abc char str 10 int main struct Abc s1 s1 str Hello error 我可以理解这种行为 因为它与 char str 10 str Hello in
  • 使用Java API将数据上传到HDFS

    我已经搜索了一段时间 但似乎没有一个解决方案适合我 非常简单 我想使用 Java API 将数据从本地文件系统上传到 HDFS Java 程序将在已配置为通过 shell 与远程 Hadoop 集群通信的主机上运行 即hdfs dfs ls
  • ggplot2:如何动态包装/调整大小/重新缩放 x 轴标签,使其不会重叠

    我正在尝试实现一种包装 x 轴标签的解决方案 以便它们不会重叠 我知道这个问题已经被问过好几次了 并且有一些好的答案 但是 我见过的解决方案都没有回答如何随着情节的发展重新包装标签resized SO 的三个不同答案让我相信这是可以实现的
  • Mac 上的 SWT 问题

    我有一个使用 SWT UI 的 java 项目 但在任何 Mac OS X 计算机上部署它时遇到了问题 当程序从 Eclipse 中或从 jar 文件运行时 它本身可以在 Windows 上完美运行 在 Mac 上 该程序在 Eclipse
  • MongoDB:是否可以进行不区分大小写的查询?

    Example gt db stuff save foo bar gt db stuff find foo bar count 1 gt db stuff find foo BAR count 0 你可以使用regex 在你的例子中 这将是
  • 从linux命令行创建word doc文件

    我有一些 HTML 文件需要以 MS Word 文档格式分发 不要问 我可以在 OpenOffice 中手动打开每个文件 然后另存为 doc 文件 但我有很多文件 所以我想自动执行此操作 你知道一个方法吗 没有测试过 但是有pyuno访问
  • 将大小写切换到/之间

    Javascript 有没有一种方法可以通过 switch case 结构将一个整数与另一个整数进行比较 而不使用 if 语句 E g switch integer case 1 to 10 break case 11 to 20 brea
  • Mpi 在 Windows 中的使用

    我将 mpi 安装到 Windows 中 并且可以使用它的库 问题是 当我在 Windows 中编写时 mpiexec n 4 proj exe 进入命令提示符后 它不会进行正确的操作 4个不同的进程分别使用整个代码文件 它们的行为不像仅在
  • C# 并行运行多个非阻塞外部程序

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