public DaemonRT(DaemonDto dto, string root, int delay) { this.delay = delay; this.dto = dto.Clone(); using (var disposer = new Disposer()) { process = new DaemonProcess(new DaemonProcess.Args { Executable = PathTools.Combine(root, dto.Path), //id matches [a-zA_Z][a-zA_Z0-9_]* Arguments = string.Format("Id={0} Daemon=True {1}", dto.Id, dto.Args), }); disposer.Push(process); status = "Starting..."; reader = new Runner(new Runner.Args { ThreadName = string.Format("DAEMON_{0}_{1}_O", dto.Id, process.Id) }); erroer = new Runner(new Runner.Args { ThreadName = string.Format("DAEMON_{0}_{1}_E", dto.Id, process.Id) }); disposer.Push(erroer); disposer.Push(Dispose); //ensure cleanup order erroer.Run(ErrorLoop); reader.Run(ReadLoop); reader.Run(UpdateRestart); disposer.Clear(); } }