コード例 #1
0
 void IConsoleProcessMonitor.Output(IConsoleProcess process, string line)
 {
     if (_ResetOnOutput)
     {
         lock (_Lock)
             _Timer?.Change(_Timeout, _InfiniteTimeSpan);
     }
 }
コード例 #2
0
 void IConsoleProcessMonitor.Started(IConsoleProcess process)
 {
     lock (_Lock)
     {
         _Timer   = new Timer(TimerCallback, null, _Timeout, _InfiniteTimeSpan);
         _Process = process;
     }
 }
コード例 #3
0
 void IConsoleProcessMonitor.Exited(IConsoleProcess process, int exitCode)
 {
     lock (_Lock)
     {
         _Timer?.Dispose();
         _Timer   = null;
         _Process = null;
     }
 }
コード例 #4
0
 void IDisposable.Dispose()
 {
     lock (_Lock)
     {
         _Timer?.Dispose();
         _Timer   = null;
         _Process = null;
     }
 }
コード例 #5
0
        void IConsoleProcessMonitor.Output(IConsoleProcess process, string line)
        {
            if (line == null)
            {
                throw new ArgumentNullException(nameof(line));
            }

            Events.Add(new ConsoleProcessStandardOutputEvent(process.ExecutionDuration, DateTime.Now, line));
        }
コード例 #6
0
        private async Task EnterInputAndWaitForExitAsync(IConsoleProcess process, ProcessRunArguments args)
        {
            await Task.Yield();

            process.WriteStandardInput(args.StandardInput.StringValue);
            process.WriteStandardInput("\n");
            process.CloseStandardInput();

            process.WaitForExit((int)args.MaxRuntime.TotalMilliseconds + 300);
        }
コード例 #7
0
        private void TimerCallback(object state)
        {
            bool shouldTerminate;

            lock (_Lock)
            {
                shouldTerminate = _Timer != null;
                _Timer?.Dispose();
                _Timer = null;
            }

            if (shouldTerminate)
            {
                _Process?.Terminate();
            }

            _Process = null;
        }
コード例 #8
0
        private ProcessRunResult Run(ProcessRunArguments args)
        {
            IConsoleProcess process = args.Application.StartProcess(args.ProcessArguments);

            bool timelyExit = TryWaitForTimelyExitAsync(process, args).GetAwaiter().GetResult();
            bool crashed    = process.TryFindCrashReport(out ICrashReport report);

            string stdOut = process.GetStandardOutput();
            string stdErr = process.GetStandardError();

            return(new ProcessRunResult(
                       DeduceExitType(crashed, timelyExit),
                       report,
                       StringOrFile.FromText(stdOut),
                       StringOrFile.FromText(stdErr),
                       100,
                       process.ExitCode,
                       process.ExecutionTime
                       ));
        }
コード例 #9
0
        private async Task <bool> TryWaitForTimelyExitAsync(IConsoleProcess process, ProcessRunArguments args)
        {
            bool timelyExit = true;

            await Task.WhenAny(
                Task.Delay(args.MaxRuntime),
                EnterInputAndWaitForExitAsync(process, args)
                );

            if (!process.HasExited)
            {
                await Task.Delay(100);

                process.EnsureKilled();
                timelyExit = false;
            }
            else
            {
                timelyExit = true;
            }

            return(timelyExit);
        }
コード例 #10
0
 public void Exited(IConsoleProcess process, int exitCode)
 {
     _Logger.LogDebug($"process #{process.Id} terminated with exit code {exitCode}");
 }
コード例 #11
0
 void IConsoleProcessMonitor.Output(IConsoleProcess process, string line)
 {
     StandardOutput?.Invoke(this, new ConsoleProcessOutputEventArgs(DateTime.Now, process.ExecutionDuration, process, line));
 }
コード例 #12
0
 void IConsoleProcessMonitor.Started(IConsoleProcess process)
 {
     Started?.Invoke(this, new ConsoleProcessStartedEventArgs(DateTime.Now, process.ExecutionDuration, process));
 }
コード例 #13
0
 void IConsoleProcessMonitor.Exited(IConsoleProcess process, int exitCode)
 {
     Events.Add(new ConsoleProcessExitedEvent(process.ExecutionDuration, DateTime.Now, exitCode));
 }
コード例 #14
0
 void IConsoleProcessMonitor.Started(IConsoleProcess process)
 {
     Events.Add(new ConsoleProcessStartedEvent(process.ExecutionDuration, DateTime.Now));
 }
コード例 #15
0
 public void Output(IConsoleProcess process, string line)
 {
     _Logger.LogDebug($"process #{process.Id}: {line}");
 }
コード例 #16
0
 public void Error(IConsoleProcess process, string line)
 {
     _Logger.LogDebug($"process #{process.Id} error: {line}");
 }
コード例 #17
0
 protected ConsoleProcessEventArgs(DateTime timestamp, TimeSpan relativeTimestamp, [NotNull] IConsoleProcess process)
 {
     Timestamp         = timestamp;
     RelativeTimestamp = relativeTimestamp;
     Process           = process ?? throw new ArgumentNullException(nameof(process));
 }
コード例 #18
0
 public ConsoleProcessStartedEventArgs(DateTime timestamp, TimeSpan relativeTimestamp, [NotNull] IConsoleProcess process)
     : base(timestamp, relativeTimestamp, process)
 {
 }
コード例 #19
0
 void IConsoleProcessMonitor.Exited(IConsoleProcess process, int exitCode)
 {
     Exited?.Invoke(this, new ConsoleProcessExitedEventArgs(DateTime.Now, process.ExecutionDuration, process, exitCode));
 }
コード例 #20
0
 public ConsoleProcessOutputEventArgs(DateTime timestamp, TimeSpan relativeTimestamp, [NotNull] IConsoleProcess process, [NotNull] string line)
     : base(timestamp, relativeTimestamp, process)
 {
     Line = line;
     if (line == null)
     {
         throw new ArgumentNullException(nameof(line));
     }
 }
コード例 #21
0
 public ConsoleProcessExitedEventArgs(DateTime timestamp, TimeSpan relativeTimestamp, [NotNull] IConsoleProcess process, int exitCode)
     : base(timestamp, relativeTimestamp, process)
 {
     ExitCode = exitCode;
 }
コード例 #22
0
 public void Started(IConsoleProcess process)
 {
     _Logger.LogDebug($"process #{process.Id} started");
 }