5
// Jérémie Laval <jeremie.laval@xamarin.com>
7
// Copyright (c) 2012 Xamarin, Inc.
11
using System.Diagnostics;
12
using System.Threading;
13
using System.Threading.Tasks;
17
public static class ProcessUtils
19
public static Task<int> StartProcess (ProcessStartInfo psi, TextWriter stdout, TextWriter stderr, CancellationToken cancellationToken)
21
var tcs = new TaskCompletionSource<int> ();
22
if (cancellationToken.CanBeCanceled && cancellationToken.IsCancellationRequested) {
27
psi.UseShellExecute = false;
29
psi.RedirectStandardOutput = true;
32
psi.RedirectStandardError = true;
34
var p = Process.Start (psi);
35
if (cancellationToken.CanBeCanceled)
36
cancellationToken.Register (() => {
41
} catch (InvalidOperationException ex) {
42
if (ex.Message.IndexOf ("already exited") < 0)
46
p.EnableRaisingEvents = true;
47
if (psi.RedirectStandardOutput) {
48
bool stdOutInitialized = false;
49
p.OutputDataReceived += (sender, e) => {
51
if (stdOutInitialized)
53
stdout.Write (e.Data);
54
stdOutInitialized = true;
55
} catch (Exception ex) {
56
tcs.SetException (ex);
59
p.BeginOutputReadLine ();
61
if (psi.RedirectStandardError) {
62
bool stdErrInitialized = false;
63
p.ErrorDataReceived += (sender, e) => {
65
if (stdErrInitialized)
67
stderr.Write (e.Data);
68
stdErrInitialized = true;
69
} catch (Exception ex) {
70
tcs.SetException (ex);
73
p.BeginErrorReadLine ();
75
p.Exited += (sender, e) => tcs.SetResult (p.ExitCode);
80
public static void StartRelaunchProcess ()