【发布时间】:2018-07-18 07:11:57
【问题描述】:
我正在用一些对我来说很难的事情来挑战自己..
我想要一个运行“从属终端”的“主终端”。 从站使用“重定向输出”选项 (RedirectStandardOutput) 启动。 从站必须异步运行,主站应管理从站的“ReadLine”。 当 slave 运行时,master 必须能够执行其他操作。
我的实际代码:
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();
}
如您所见,我尝试了启动和不启动新线程。 线程看起来很好,我在从终端完成操作之前到达了 Main void 的末尾,但是我在从站的“ReadLine”请求中被阻塞了。用户必须按 Enter 才能继续,我不希望这样..
你能帮帮我吗? 您建议采用不同的方法吗?
谢谢,问候。
编辑 1:
我想管理从终端等待“进入”的情况,因为它可能由第三方开发,可能会忽略我说不要使用Console.ReadLine() 的指导方针(好吧,不是我的问题,但我喜欢愚蠢的证明软件)。
主终端正在管理未定义数量的从终端,并记录从终端的所有输出,并运行一个看门狗,如果它崩溃,它会重新启动一个从终端。
Master 还接收启动/停止/重启 Slave 的命令和/或其他命令。
【问题讨论】:
-
我想我终于明白了,所以
StartTerminal本质上运行子进程,它可以包含一个ReadLine(或另一个命令,可以阻止程序流) .我认为您需要的是异步线程或任务,其中每个都应该调用您的StartTerminal( ... )方法。我会尽快更新我的答案 -
你不需要一个线程来启动一个进程。 根据定义,不同的进程在不同的线程上运行。只需致电
process.Start() -
你到底想做什么?这段代码中没有与多线程相关的内容,只是两个进程通过它们的输入/输出流进行通信。如果您想并行或异步处理数据,有许多方法比使用两个线程快 100000 倍、更好、更具可扩展性。例如,
Parallel.ForEach()将使用所有内核并行处理数据。您要解决的实际问题是什么? -
如果您希望管道中的两个或更多工作人员处理数据,请检查数据流类,例如 ActionBlock、TransformBlock。
标签: c# multithreading asynchronous process