使用控制台应用程序 .NET Core 在并行 C# 中运行两个 dotnet 进程

2024-02-09

我有一个包含三个控制台的项目。一个控制台将并行打开其他两个进程来执行某些工作(独立)。

所有控制台都使用 dotnet core 框架。

MultipleConsoleWindows主要应用程序如下所示:

static void Main(string[] args)
{
    Task t1 = new Task(async () => { await ProcessManager.StartAsync("c1"); });
    Task t2 = new Task(async () => { await ProcessManager.StartAsync("c2"); });

    // what should do here ?

    Console.WriteLine("done");
    Console.Read();
}

和 ProcessManager 类:

public static class ProcessManager
{
    const string C1 = @"pathTo\ConsoleNumberOne.dll";
    const string C2 = @"pathTo\ConsoleNumberTwo.dll";

    public static async Task<string> StartAsync(string type)
    {
        Console.WriteLine($"Start {type}");

        var proc = type.Equals("c1") ? C1 : C2;
        return await Task.Run(() => StartProcess(proc));
    }

    static string StartProcess(string proc)
    {
        ProcessStartInfo procStartInfo = new ProcessStartInfo();
        procStartInfo.FileName = "dotnet";
        procStartInfo.Arguments = $"\"{proc}\"";
        procStartInfo.WorkingDirectory = Path.GetDirectoryName(proc);

        procStartInfo.UseShellExecute = false;
        procStartInfo.CreateNoWindow = true;

        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.RedirectStandardError = true;

        int output = 0;

        StringBuilder sb = new StringBuilder();
        using (Process pr = new Process())
        {
            pr.StartInfo = procStartInfo;

            pr.OutputDataReceived += (s, ev) =>
            {
                if (string.IsNullOrWhiteSpace(ev.Data))
                {
                    return;
                }

                sb.AppendLine(ev.Data);

                string[] split = ev.Data.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
                int.TryParse(split[split.Length - 1], out output);
            };

            pr.ErrorDataReceived += (s, err) =>
            {
                if (!string.IsNullOrWhiteSpace(err.Data))
                {
                    sb.AppendLine(err.Data);

                    output = 0;
                }
            };

            pr.EnableRaisingEvents = true;
            pr.Start();
            pr.BeginOutputReadLine();
            pr.BeginErrorReadLine();

            pr.WaitForExit();

            return sb.ToString();
        }
    }
}

The ConsoleNumberOne and ConsoleNumberTwo看起来很相似

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");
    Thread.Sleep(10000);
}

and

static void Main(string[] args)
{
     Console.WriteLine("Hello World!");
     Thread.Sleep(5000);
}

我试图同时打开两个各自完成工作的控制台。

如何实现这一目标MultipleConsoleWindows side ?


没有必要使用Task.Run启动一个子进程。而不是使用WaitForExit();阻塞直到进程退出,文档表明 https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.waitforexit?view=netframework-4.7.2 :

为了避免阻塞当前线程,请使用Exited https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.exited?view=netframework-4.7.2 event.

在任务之前,事件是异步执行作业和接收通知的方法之一。这被称为Event-Based Asynchronous Pattern。可以使用 TaskCompletionSource 将事件转换为任务。这在如何:将 EAP 模式包装到任务中 https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-wrap-eap-patterns-in-a-task.

该示例比应有的更冗长一些。在这种情况下,转换Exited任务很简单:

static Task<string> StartProcess(string proc)
{

        StringBuilder sb = new StringBuilder();
        Process pr = new Process
        {
            StartInfo = procStartInfo
        };

        var tcs = new TaskCompletionSource<string>();

        pr.Exited += (o, e) =>
        {
            tcs.SetResult(sb.ToString());
            pr.Dispose();
        };

        ....

        return tcs.Task;
}

可以通过这种方式启动和等待多个进程:

static async Task Main(string[] args)
{
    var p1 = StartProcess("--version");
    var p2 = StartProcess("--list-runtimes");

    string[] responses=await Task.WhenAll(p1, p2);

    ...
}

任务完成源.SetResult https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskcompletionsource-1.setresult?view=netframework-4.7.2完成 tcs 返回的任务并设置其结果,在本例中为字符串。设置异常 https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskcompletionsource-1.setexception?view=netframework-4.7.2可用于将任务设置为故障状态,在等待时引发异常。例如,如果任何进程返回非零退出代码,这可以用于取消等待

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

使用控制台应用程序 .NET Core 在并行 C# 中运行两个 dotnet 进程 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 更改Linux上的线程名称(htop)

    我有一个多线程应用程序 我希望 htop 作为示例 为每个运行的线程显示不同的名称 目前它显示的是用于运行主程序的 命令行 我尝试过使用 prctl PR SET NAME 但它仅适用于 top 并且该调用只能指定最多 16 个字节的名称
  • 烦恼 - 如何禁用 Eclipse 类路径条目警告

    我已经搜索了选项 但似乎找不到禁用这些警告的方法 诸如此类的警告 Classpath entry org eclipse jdt junit JUNIT CONTAINER 4 will not be exported or publish
  • 并发收集支持删除指定项吗?

    非常简单 除了 ConcurrentDictionary 如果必须的话我会使用它 但这不是真正正确的概念 是否有任何并发 集合 IPrducerConsumer 实现 支持基于项目或谓词的简单相等性删除特定项目定义删除条件 说明 我有一个多
  • 将 unicode 字符编码为 un​​icode 转义序列

    我有一个包含网站和地址的 CSV 文件 我需要处理这个文件来生成一个 json 文件 我将在 Django 中使用该文件将初始数据加载到我的数据库中 为此 我需要将 CSV 文件中的所有特殊字符转换为 unicode 转义字符 这是一个例子
  • 如何防止使用 Zend Framework 编写的应用程序中的 SQL 注入攻击?

    我对ZF的安全没有任何概念 操作数据库时必须使用Filter吗 也许绑定就足够了 这个怎么样 users gt update data id 1 是否应该以某种方式过滤 data 数组 请随意写下您所知道的有关该问题的任何内容 您能否提供一
  • 如何将 osx 中的 GCC 从 xcode 移动到 /usr/bin

    我在 Developer usr bin gcc 中有 gcc 编译器 但是当我在终端中输入 gcc 时 它说找不到 我认为这是因为它不在 usr bin 目录中 那么我可以a 将gcc从第一个目录移动到第二个目录 或者设置某种将gcc指向
  • 量角器错误:在 Firefox 上执行“等待 WebDriver 服务器位于 http://127.0.0.1:50636/hub 时超时”

    我在 Firefox 上执行脚本 收到一条 Firefox 升级通知 我将其关闭 再次开始执行 但出现如下错误 Rohits MacBook Pro FFAutomation rohitgathibandhe Users rohitgath
  • 蓝牙 HC-05 发送错误 1F 仅适用于 INQ 命令

    我的新蓝牙 HC 05 模块有问题 在 AT 模式下 它可以与我需要的所有命令完美配合 除了 INQ 我已经尝试事先发送一大堆其他命令 AT INIT OK AT ORGL OK AT ROLE 1 OK AT CLASS 0 OK 他们都
  • 每个版本的 iOS 都附带什么版本的 mobile safari?

    我正在尝试找出可以使用哪些 Javascript API 来实现对 Mobile Safari 到 iOS2 的支持 我还没有在任何地方找到一个列表来显示每个新版本的 iOS 附带的 Mobile Safari 版本 我正在寻找一个可以追溯
  • Laravel,转储自动加载,无需 Shell 访问

    我有两个同名的控制器 app controllers CareersController php 供公众使用 app controllers Admin CareersController php 对于管理员 由于命名冲突 我添加了name
  • 将 String 转换为 Int 并添加特定值

    我有一根绳子ABC0001 我想添加 1对于数据库中的每个新条目 如果我采取SubString 3 myStr Length 3 它只给了我1 修剪所有 0 零 有没有其他方法可以为每个新条目添加 1 Thanks 让我们尝试下面的代码 我
  • python正则表达式获取所有文本直到(,并获取括号内的文本

    我需要两个正则表达式操作的帮助 获取左括号之前的所有文本 e g this is so cool 234 gt this is so cool 获取括号内的文本 即数字 234 直到父级 regex re compile s 在第一组括号内
  • 从 Google App Engine for PHP 加载远程 XML

    我想将第三方服务器的远程动态 XML 文件加载到我的 GAE PHP 应用程序中 itemId 5 uri http www myserver com getInfoItem php itemId itemId format xml 我尝试
  • 如何让atom更像WebStorm IDE?

    所以我喜欢 WebStorm 的一点是它可以在输入 后执行惊人的自动完成功能 我喜欢所有的代码完成和 linting Webstorm 资源消耗很大 而且相当丑陋 对于atom 我不知道如何做到这一点 我可以安装或自定义哪些插件才能使其满足
  • 获取最新的不同记录

    考虑下表 User CreatedDateTime Quantity Jim 2012 09 19 01 00 1 Jim 2012 09 19 02 00 5 Jim 2012 09 19 03 00 2 Bob 2012 09 19 0
  • 如何对谷歌云 git repo 进行代码审查

    我们在谷歌云平台上托管 git repo 我知道对于 github com 我们可以使用拉取请求进行代码审查 但谷歌云似乎没有提供这一点 如何对 Google 云平台上的存储库进行代码审查 一种可能性 我知道并不理想 但仍然有效 是将您的云
  • 适用于 Facebook 可玩广告的 SDK

    我想为 Facebook 平台制作 HTML 可播放广告并在其中显示用户头像 是否可以 根据文档 https developers facebook com docs app ads formats playable ad 可播放广告不得发
  • 如何在 Node Express 中像静态 HTML 页面一样提供渲染的 Jade 页面?

    通常你会在这样的路径中渲染 Jade 页面 app get page function req res next res render page jade 但我想提供所有 Jade 页面 自动呈现 就像提供静态 HTML 一样 app us
  • iOS 线性规划库

    我正在寻找一个 iOS 库 可以为我正在开发的应用程序解决 LP IP BIP MIP 问题 我找到了 GLPK 但不知道如何为 iOS 编译它 在网上搜索了一段时间后 我没有找到任何有趣的东西 如果有人可以帮助我如何编译适用于 iOS 的
  • 使用控制台应用程序 .NET Core 在并行 C# 中运行两个 dotnet 进程

    我有一个包含三个控制台的项目 一个控制台将并行打开其他两个进程来执行某些工作 独立 所有控制台都使用 dotnet core 框架 MultipleConsoleWindows主要应用程序如下所示 static void Main stri