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); } } } }
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); } }