Timer MonitorProcessOutput(Process process, TimeSpan timeout) { Contract.Requires<ArgumentNullException>(process != null); Contract.Requires<ArgumentNullException>(timeout != null); var state = process.MonitorProcessOutput(); _monitorStarted.OnNext(Tuple.Create(process.StartInfo, process.Id, "Output")); return new TimerWithElapsedCancellation(MonitorInterval, () => OnOutputMonitorElapsed(process, state, timeout), (o, args) => _monitorStopped.OnNext(Tuple.Create(process.StartInfo, process.Id, "Output"))); }