public void Process(Input input) { cajuService.Run(input); RunOutput output = outputConverter.Map <RunOutput>(input); outputBoundary.Populate(output); }
private void RunOutput_TextChanged(object sender, TextChangedEventArgs e) { RunOutput.ScrollToEnd(); }
public static RunOutput RunAndGetOutput([NotNull] string execName, string arguments, RunSettingsBase settings, WaitHandle awaitableHandle) { settings ??= RunSettingsBase.Default; settings.RedirectOutput = true; settings.RedirectError = true; RunOutput output = new RunOutput(); using (Process process = CreateForRun(execName, arguments, settings)) { bool processReallyExited = false; process.Exited += (sender, _) => { Process p = (Process)sender; if (p.IsAssociated()) { try { output.ExitTime = p.ExitTime; output.ExitCode = p.ExitCode; } catch { // ignored } } processReallyExited = true; settings.OnExit?.Invoke(execName, output.ExitTime, output.ExitCode); }; try { bool result = process.Start(); if (!result) { return(null); } if (!settings.JobHandle.IsInvalidHandle()) { ProcessJob.AddProcess(settings.JobHandle, process); } output.StartTime = process.StartTime; settings.OnStart?.Invoke(execName, output.StartTime); AsyncStreamReader outputReader = new AsyncStreamReader(process, process.StandardOutput.BaseStream, data => { if (data == null) { return; } output.Output.Append(data); output.OutputBuilder.Append(data); }, process.StandardOutput.CurrentEncoding); outputReader.BeginRead(); AsyncStreamReader errorReader = new AsyncStreamReader(process, process.StandardError.BaseStream, data => { if (data == null) { return; } output.Error.Append(data); output.OutputBuilder.Append(data); }, process.StandardOutput.CurrentEncoding); errorReader.BeginRead(); if (!awaitableHandle.IsAwaitable()) { process.WaitForExit(); return(output); } SafeWaitHandle waitHandle = null; ManualResetEvent processFinishedEvent = null; try { waitHandle = new SafeWaitHandle(process.Handle, false); if (!waitHandle.IsAwaitable()) { return(null); } processFinishedEvent = new ManualResetEvent(false) { SafeWaitHandle = waitHandle }; if (!awaitableHandle.IsAwaitable()) { return(null); } WaitHandle[] waitHandles = { processFinishedEvent, awaitableHandle }; int ndx = waitHandles.WaitAny(); if (ndx != 0) { return(null); } if (!processReallyExited && process.IsAwaitable()) { if (!process.WaitForExit(TimeSpanHelper.HALF)) { ndx = -1; } } process.Die(); return(ndx != 0 ? null : output); } finally { processFinishedEvent?.Close(); ObjectHelper.Dispose(ref processFinishedEvent); waitHandle?.Close(); ObjectHelper.Dispose(ref waitHandle); } } catch (Win32Exception e) { throw new InvalidOperationException(e.CollectMessages(), e); } } }