Inheritance: MonoDevelop.ProjectSystem.Tools.MSBuildTargetProgressMonitor
        ProcessWrapper StartProcess(string command, string arguments, string workingDirectory, TextWriter outWriter, TextWriter errorWriter, EventHandler exited)
        {
            int currentSessionId = Interlocked.Increment(ref sessionId);

            var msbuildProcessArguments = new MSBuildProcessArguments(arguments);

            var buildTarget = new MSBuildTarget {
                ProjectName     = GettextCatalog.GetString("Solution"),
                ProjectFileName = GettextCatalog.GetString("Solution"),
                Targets         = msbuildProcessArguments.Targets,
                BuildType       = msbuildProcessArguments.BuildType,
                Dimensions      = GetDimensions(msbuildProcessArguments.Targets)
            };

            buildTarget.Start();

            arguments = MSBuildProcessArguments.AddVerbosity(arguments, Runtime.Preferences.MSBuildVerbosity.Value);
            arguments = MSBuildProcessArguments.AddBinLogFileName(arguments, buildTarget.BinLogFileName);

            lock (buildTargets) {
                buildTargets [currentSessionId] = buildTarget;
            }

            ProjectSystemService.OnTargetStarted(buildTarget);

            var monitor = new MSBuildProcessProgressMonitor(outWriter, errorWriter, buildTarget.LogFileName);

            ProcessWrapper process = Runtime.ProcessService.StartProcess(
                command,
                arguments,
                workingDirectory,
                monitor.Log,
                monitor.ErrorLog,
                exited);

            monitor.Process = process;

            process.Task.ContinueWith(_ => {
                OnMSBuildProcessExited(currentSessionId, monitor);
            });

            return(process);
        }
        void OnMSBuildProcessExited(int currentSessionId, MSBuildProcessProgressMonitor monitor)
        {
            MSBuildTarget buildTarget = null;

            using (monitor) {
                lock (buildTargets) {
                    if (buildTargets.TryGetValue(currentSessionId, out buildTarget))
                    {
                        buildTargets.Remove(currentSessionId);
                    }
                    else
                    {
                        return;
                    }
                }

                if (monitor.Process.Task.IsFaulted)
                {
                    buildTarget.OnException(monitor.Process.Task.Exception);
                }
                else if (monitor.Process.Task.IsCanceled)
                {
                    buildTarget.OnResult(MSBuildTargetStatus.Failed);
                }
                else if (monitor.Process.ProcessAsyncOperation.ExitCode == 0)
                {
                    buildTarget.OnResult(MSBuildTargetStatus.Finished);
                }
                else
                {
                    buildTarget.OnResult(MSBuildTargetStatus.Failed);
                }
            }

            ProjectSystemService.OnTargetFinished(buildTarget);
        }