public static Process ExecuteBlocking( IFile exeFile, params string[] args) { var processSetup = new ProcessSetup(exeFile, args) { Method = ProcessExecutionMethod.BLOCK, }; return(ProcessUtil.Execute(processSetup)); }
public ReactivityDataCollector() { var profilersLocation = Path.Combine( Path.GetDirectoryName( new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath), "profiler"); mProcessSetup = new ProcessSetup(profilersLocation) { WaitForConnection = true, MonitorAllFromStart = true }; }
public virtual int SetupProcessing(ref ProcessSetup setup) { System.Diagnostics.Trace.WriteLine("IAudioProcessor.SetupProcessing"); if (this.IsActive) { return(TResult.E_Unexpected); } if (!TResult.IsTrue(CanProcessSampleSize(setup.SymbolicSampleSize))) { return(TResult.S_False); } this.MaxSamplesPerBlock = setup.MaxSamplesPerBlock; this.ProcessMode = setup.ProcessMode; this.SampleRate = setup.SampleRate; this.SampleSize = setup.SymbolicSampleSize; return(TResult.S_True); }
public async Task Launch(LaunchInfo launchInfo, CancellationToken cancellationToken) { var psi = new ProcessStartInfo(); psi.FileName = launchInfo.FileName; psi.Arguments = launchInfo.Arguments; psi.UseShellExecute = false; var processSetup = new ProcessSetup(mProfilersLocation); if (launchInfo.Options.HasFlag(LaunchOptions.MonitorAllFromStart)) { processSetup.MonitorAllFromStart = true; processSetup.WaitForConnection = true; } processSetup.SetEnvironmentVariables(psi); Process process; try { process = Process.Start(psi); } catch (Exception ex) { throw new ConnectionException($"Failed to start process: {ex.Message}", ex); } if (process == null) { throw new ConnectionException("Process failed to start."); } var server = new Server(process.Id, process.ProcessName, processSetup.PipeName); await Open(server, cancellationToken).ConfigureAwait(false); }
public static Process Execute(ProcessSetup processSetup) { var exeFile = processSetup.ExeFile; Asserts.True( exeFile.Exists, $"Attempted to execute a program that doesn't exist: {exeFile}"); var args = processSetup.Args; var argString = ""; for (var i = 0; i < args.Length; ++i) { // TODO: Is this safe? var arg = args[i]; if (i > 0) { argString += " "; } argString += arg; } var processStartInfo = new ProcessStartInfo($"\"{exeFile.FullName}\"", argString) { CreateNoWindow = true, RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, UseShellExecute = false, }; var process = Asserts.CastNonnull(Process.Start(processStartInfo)); ChildProcessTracker.AddProcess(process); var logger = Logging.Create(exeFile.FullName); if (processSetup.WithLogging) { process.OutputDataReceived += (_, args) => { if (args.Data != null) { logger !.LogInformation(" " + args.Data); } }; process.ErrorDataReceived += (_, args) => { if (args.Data != null) { logger !.LogError(" " + args.Data); } }; } else { process.OutputDataReceived += (_, _) => {}; process.ErrorDataReceived += (_, _) => {}; } process.BeginOutputReadLine(); process.BeginErrorReadLine(); switch (processSetup.Method) { case ProcessExecutionMethod.MANUAL: { break; } case ProcessExecutionMethod.BLOCK: { process.WaitForExit(); break; } default: throw new NotImplementedException(); } // TODO: https://stackoverflow.com/questions/139593/processstartinfo-hanging-on-waitforexit-why /* * using var outputWaitHandle = new AutoResetEvent(false); * using var errorWaitHandle = new AutoResetEvent(false); * * process.OutputDataReceived += (sender, e) => { * if (e.Data == null) { * // ReSharper disable once AccessToDisposedClosure * outputWaitHandle.Set(); * } else { * logger.LogInformation(e.Data); * } * }; * process.ErrorDataReceived += (sender, e) => { * if (e.Data == null) { * // ReSharper disable once AccessToDisposedClosure * errorWaitHandle.Set(); * } else { * logger.LogError(e.Data); * } * }; * * process.Start(); * * process.BeginOutputReadLine(); * process.BeginErrorReadLine(); * * // TODO: Allow passing in timeouts * if (outputWaitHandle.WaitOne() && * errorWaitHandle.WaitOne()) { * process.WaitForExit(); * // Process completed. Check process.ExitCode here. * } else { * // Timed out. * }*/ return(process); }