Я построил Form
приложение, которое я использую в течение некоторого времени, сейчас я хочу, чтобы поймать StandardError
моего процесса, а также его standartOutput
не могу получить вывод ошибок процесса с использованием process.ErrorDataReceived C#
Я смотрел ответы в SO и MSDN и еще и не могу получить это право
Мой код:
public void RunProcess(string FileName, string Arguments,, bool IsPrintOutput = true)
{
process = new Process();
process.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent);
if (IsPrintOutput) process.OutputDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent);
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = FileName;
process.StartInfo.Arguments = Arguments;
if (EventWhenExit)
{
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(myprocess_Exited);
}
process.Start();
process.BeginOutputReadLine();
//run polling on stored logs to print them to screen
PollingService();
}
Я проверить его с Iperf и я вижу, что, когда я запускаю его с правильным аргументом я получаю правильный вывод но когда я просто отправить его с любым argumnet я вижу, что с ЦМДОМ я получаю
C:\>iperf.exe
Usage: iperf [-s|-c host] [options]
Try `iperf --help' for more information.
И мое приложение я получаю Ничего !
Что мне здесь не хватает? Thanks
Вы можете прекратить читать здесь! Если вы хотите, чтобы увидеть детали внутреннего метода по-прежнему ниже:
private void OnDataReceivedEvent(object sender, DataReceivedEventArgs e)
{
string ProcessOutput = e.Data;
ProcessLog.Add(e.Data);
}
private void PollingService()
{
var T = new Thread (()=>
{
while (true /* ProcessRunning*/)
{
if (ProcessLogIndex < ProcessLog.Count)
{
lock (this)
{
var tempList = ProcessLog.GetRange(ProcessLogIndex, ProcessLog.Count - ProcessLogIndex);
ProcessLogIndex = ProcessLog.Count;
foreach (var ToSend in tempList)
{
onDataOutputFromProcess(this, ToSend, sProcessNameID.ToString());
}
}
}
Thread.Sleep(400);
}
});
T.IsBackground = true;
T.Start();
}
вы ТАК ПРАВО! :) Я не могу поверить, что я забыл об этом – LordTitiKaka