public static async Task<ReactiveProcess> StartAsync(string fileName, string arguments) { var p = new ReactiveProcess {StartInfo = new ProcessStartInfo(fileName, arguments)}; try { await p.StartAsync().ConfigureAwait(false); } catch { p.Dispose(); throw; } return p; }
async Task<ProcessExitResult> LaunchAndWaitForExitAsync(ReactiveProcess process, TimeSpan? monitorOutput, TimeSpan? monitorResponding, CancellationToken token) { var task = process.StartAsync(); _launched.OnNext(Tuple.Create(process.StartInfo, process.Id)); using (SetupMonitoringDisposable(process, monitorOutput, monitorResponding)) using (token.Register(process.Kill)) await task.ConfigureAwait(false); _terminated.OnNext(Tuple.Create(process.StartInfo, process.ExitCode, process.Id)); return new ProcessExitResult(process.ExitCode, process.Id, process.StartInfo); }