我有一个包含三个控制台的项目。一个控制台将并行打开其他两个进程来执行某些工作(独立)。
所有控制台都使用 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 ?