ServiceMonitor.ProcessModel.Start C# (CSharp) Method

Start() public method

public Start ( ) : void
return void
        public void Start()
        {
            if (Running)
                return;

            _manualStop = false;

            Running = true;

            var info = new ProcessStartInfo(FileName);

            info.Arguments = Args;
            info.RedirectStandardOutput = true;
            info.RedirectStandardError = true;
            info.RedirectStandardInput = true;
            info.StandardErrorEncoding = Encoding.UTF8;
            info.StandardOutputEncoding = Encoding.UTF8;
            info.UseShellExecute = false;
            info.CreateNoWindow = true;
            if (string.IsNullOrEmpty(WorkDir))
            {
                info.WorkingDirectory = Path.GetDirectoryName(FileName);
            }
            else
            {
                info.WorkingDirectory = WorkDir;
            }

            ThreadPool.QueueUserWorkItem(delegate(object state)
            {

                SafeCall( delegate {

                    if (OnStart != null)
                    {
                        OnStart(this);
                    }
                });

                Process p = null;
                try
                {
                    p = Process.Start(info);
                    _process = p;
                }
                catch (Exception e)
                {
                    SafeCall( delegate {
                        OnError( this, Color.Red, e.ToString() );

                    });
                }

                if (p != null)
                {
                    p.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e)
                    {
                        if (e.Data == null)
                            return;

                        var c = ColorSettings.PickColorFromText(e.Data);

                         SafeCall( delegate {

                             WriteLog(c, e.Data);
                         });
                    };

                    p.ErrorDataReceived += delegate(object sender, DataReceivedEventArgs e)
                    {
                        if (e.Data == null)
                            return;

                        var c = ColorSettings.PickColorFromText(e.Data);

                        SafeCall( delegate {

                            WriteLog(c, e.Data);
                         });
                    };

                    p.BeginOutputReadLine();
                    p.BeginErrorReadLine();

                    Application.DoEvents();
                    p.WaitForExit();

                    ExitCode = p.ExitCode;

                    p.Close();
                }

                SafeCall(delegate
                {
                    if (!_manualStop)
                    {
                        SelfExit = true;
                    }

                    if (OnExit != null)
                    {
                        OnExit(this );
                    }
                });

                _process = null;
                Running = false;

            });
        }

Usage Example

示例#1
0
        // 命名规则: 与svc同目录下,  svc.exe 对应的批处理是 svc_Build.bat
        void RunSvcShell(ProcessModel svcModel, bool startAfterDone)
        {
            if (!svcModel.Valid)
            {
                return;
            }

            // 还在跑的进程, 必须停下来
            if (svcModel.Running)
            {
                svcModel.Stop();
            }

            var buildcmd = Path.Combine(Path.GetDirectoryName(svcModel.FileName), Path.GetFileNameWithoutExtension(svcModel.FileName) + "_Build") + ".bat";

            var shellModel = new ProcessModel();

            shellModel.FileName = buildcmd;
            shellModel.invoker  = this;
            shellModel.CanStop  = false;

            shellModel.OnStart += (m) =>
            {
                m.WriteLog(Color.Yellow, "启动Shell: " + buildcmd);
            };

            Action <ProcessModel> stopProc = (m) =>
            {
                m.WriteLog(Color.Yellow, "结束Shell: " + buildcmd);

                // 编译正常时, 启动进程
                if (startAfterDone && shellModel.ExitCode == 0)
                {
                    svcModel.Start();
                }
            };


            shellModel.OnStop += stopProc;
            shellModel.OnExit += stopProc;

            shellModel.OnLog   += svcModel.OnLog;
            shellModel.OnError += svcModel.OnError;

            shellModel.Start();

            RefreshButtonStatus();
        }
All Usage Examples Of ServiceMonitor.ProcessModel::Start