Ejemplo n.º 1
0
        private void Loop(ProcessStartInfo pi)
        {
            while (!disposed)
            {
                try
                {
                    var first = new Disposer();

                    using (var disposer = new Disposer())
                    {
                        disposer.Add(first);

                        var proc = Process.Start(pi);

                        disposer.Add(proc);
                        disposer.Add(proc.Kill);

                        var stateTask = Task.Factory.StartNew(() => ReadState(proc), opts);
                        var errorTask = Task.Factory.StartNew(() => ReadError(proc), opts);

                        first.Add(stateTask);
                        first.Add(errorTask);

                        while (true)
                        {
                            if (disposed)
                            {
                                break;
                            }
                            if (stateTask.IsCompleted && errorTask.IsCompleted)
                            {
                                break;
                            }
                            Thread.Sleep(10);
                        }
                    }
                }
                catch (Exception ex)
                {
                    state.Enqueue(ex.Message);
                    error.Enqueue(Readable.Make(pi.FileName));
                    error.Enqueue(Readable.Make(pi.Arguments));
                    error.Enqueue(ex.Message);
                    var millis = 5000;
                    while (--millis > 0)
                    {
                        if (disposed)
                        {
                            break;
                        }
                        Thread.Sleep(1);
                    }
                }
            }
        }
Ejemplo n.º 2
0
 private static void SafeClientLoop(int pid, IPEndPoint endpoint, TcpClient client, ProcessStartInfo pi)
 {
     try
     {
         //dynamic service location
         ClientLoop(pid, endpoint, client, pi);
     }
     catch (Exception ex)
     {
         WriteError(Readable.Make(pi.FileName));
         WriteError(Readable.Make(pi.Arguments));
         WriteError(ex.Message);
     }
 }