Тема: Process | RedirectStandardInput чи можна перевідкрити потік ?
Створення процесу виглядає так:
public const string ContainerShell = "exec -i {0} bash";
public const string containerId = "<ID>";
...
private void RunDockerShell(string containerId)
{
processDockerShell = new Process();
processDockerShell.StartInfo.FileName = "docker.exe";
processDockerShell.StartInfo.RedirectStandardInput = true;
processDockerShell.StartInfo.RedirectStandardError = true;
processDockerShell.StartInfo.RedirectStandardOutput = true;
processDockerShell.StartInfo.CreateNoWindow = true;
processDockerShell.StartInfo.UseShellExecute = false;
var CMDContainerShell = string.Format(CMD.ContainerShell, containerId);
processDockerShell.StartInfo.Arguments = CMDContainerShell;
processDockerShell.Start();
processDockerShell.BeginOutputReadLine();
processDockerShell.BeginErrorReadLine();
processDockerShell.OutputDataReceived += new DataReceivedEventHandler(ProcOutputHandler);
processDockerShell.ErrorDataReceived += new DataReceivedEventHandler(ProcOutputHandler);
}
private static void ProcOutputHandler(object sendingProcess,
DataReceivedEventArgs outLine)
{
if (!String.IsNullOrEmpty(outLine.Data))
{
Console.WriteLine("ProcOutputHandler => " + outLine.Data);
}
}
1) Якщо я пробую через StandardInput.WriteLine надіслати команду, то вона записує символ нового рядка. Символ "\n" або "\r".
'...BTC/USDT\r', а має бути '...BTC/USDT'
2) processDockerShell.WaitForExit - не працює тому що це асинхронний потік. Тобто я не можу знати коли вивід завершився.
public const string UpdatePairs = "myapp download-data --exchange binance --pairs BTC/USDT";
...
var CMDUpdatePairs = string.Format(CMD.UpdatePairs, containerId);
processDockerShell.StandardInput.WriteLine(CMDUpdatePairs);
processDockerShell.StandardInput.Flush();
Тому я вирішив використовувати StandardInput.Write та закривати потік
public const string UpdatePairs = "myapp download-data --exchange binance --pairs BTC/USDT";
...
var CMDUpdatePairs = string.Format(CMD.UpdatePairs, containerId);
processDockerShell.StandardInput.Write(CMDUpdatePairs);
processDockerShell.StandardInput.Flush();
processDockerShell.StandardInput.Close();
processDockerShell.WaitForExit(1200000);
if (!processDockerShell.HasExited)
{
...
А чи можна заново відкрити потік processDockerShell.StandardInput ? Для того щоб продовжити надсилати нові команди ?
Тобто не заново відкрити процес, а лише потік.