我正在尝试挑战自己,学习一些对我来说很困难的东西。
我想要一个“主终端”,它可以运行“从终端”。 从终端是使用“重定向输出”选项(RedirectStandardOutput)启动的。 从终端必须异步运行,而主终端应该管理来自从终端的“ReadLine”。 在从终端运行时,主终端必须能够执行其他操作。
我的实际代码:
static void StartTerminal(string ExecPath, int DefaultPort, string Arguments = "")
{
int port = DefaultPort;
if (usedPorts.Contains(port)) port = nextPort;
while(usedPorts.Contains(nextPort))
{
nextPort++;
port = nextPort;
}
usedPorts.Add(port);
string _arguments = "/port:" + port;
_arguments += Arguments;
//* Create your Process
Process process = new Process();
process.StartInfo.FileName = "dotnet ";
process.StartInfo.Arguments = ExecPath + " /c " + _arguments;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
//* Set your output and error (asynchronous) handlers
process.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
process.ErrorDataReceived += new DataReceivedEventHandler(OutErrorHandler);
//* Start process and handlers
ThreadStart ths = new ThreadStart(() => {
bool ret = process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
});
Thread th = new Thread(ths);
th.Start();
//process.Start();
//process.BeginOutputReadLine();
//process.BeginErrorReadLine();
//process.WaitForExit();
}
如您所见,我尝试了使用和不使用新线程。使用线程看起来没问题,我在主void结束之前完成了操作,但是我被从属终端的“ReadLine”请求阻塞了。用户必须按Enter键才能继续,我不想这样做。
请问您能帮助我吗?您建议采用不同的方法吗?
谢谢,问候。
编辑1: 我想处理从属终端等待“Enter”的情况,因为它可能由第三方开发,他们可能会忽略我的指导,其中我说不要使用
Console.ReadLine()
(好的,这不是我的问题,但我喜欢傻瓜证明软件)。
主终端正在管理未定义数量的从属终端,并记录所有从属终端的输出以及运行监视器以重新启动崩溃的从属终端。
主机还接收命令以启动/停止/重新启动从属终端和/或其他命令。
StartTerminal
本质上运行子进程,这些子进程可能包含一个ReadLine
(或另一个可以阻塞程序流的命令)。我认为你需要异步线程或任务,每个线程或任务都应该调用你的StartTerminal( ... )
方法。我会很快更新我的答案。 - Zeroprocess.Start()
即可。 - Panagiotis KanavosParallel.ForEach()
将使用所有核心并行处理数据。你真正想解决的问题是什么? - Panagiotis Kanavos