public Task Start(CancellationToken cancellationToken = default(CancellationToken))
{
var tcs = new TaskCompletionSource<object>();
if (cancellationToken.IsCancellationRequested)
{
tcs.SetCanceled();
return tcs.Task;
}
try
{
var proc = new Process { EnableRaisingEvents = true, StartInfo = _startInfo };
DataReceivedEventHandler onOutput = null;
onOutput =
(sender, e) =>
{
if (cancellationToken.IsCancellationRequested)
{
tcs.TrySetCanceled();
}
try
{
Debug.WriteLine(" [StdOut]\t{0}", (object)e.Data);
if (string.Equals(ReadyMsg, e.Data, StringComparison.OrdinalIgnoreCase))
{
proc.OutputDataReceived -= onOutput;
_process = proc;
tcs.TrySetResult(null);
}
}
catch (Exception ex)
{
tcs.TrySetException(ex);
proc.Dispose();
}
};
proc.OutputDataReceived += onOutput;
proc.ErrorDataReceived += (sender, e) => Debug.WriteLine(" [StdOut]\t{0}", (object)e.Data);
proc.Exited += (sender, e) => Debug.WriteLine(" IIS Express exited.");
proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
ProcessId = proc.Id;
}
catch (Exception ex)
{
tcs.TrySetException(ex);
}
return tcs.Task;
}