public void Run() { _ipc.Start(); AddModules(); foreach (var m in _modules) { m.Value.SetDaemon(this); new Thread(m.Value.MessageLoop).Start(); } while (true) { InterProcessMessage msg = _ipc.GetMessage(); if (msg == null) { Console.Error.WriteLine("null received. exit."); break; } // Console.WriteLine($"msg is module {msg.Module}, command {msg.Command}, args {msg.Args.ToStringForNetwork()}"); if (InterProcessMessage.IsTerminator(msg)) { break; } if (_modules.TryGetValue(msg.Module, out var module)) { module.OnMessage(msg); } } foreach (var m in _modules) { m.Value.OnMessage(InterProcessMessage.Terminator); } _ipc.Close(); }