public async Task Proccess(string str) { /* * Мы знаем, что все сообщения должны заканчиваться на <EOF> */ string json = str.Replace("<EOF>", ""); /* * Также мы знаем, что все сообщения имеют общий вид */ Message message = JsonConvert.DeserializeObject <Message>(json); /* сообщение от робота. Его нужно отправить в на Сервер в любом случае. * Также мы должны начать отправлять эхо запросы и сделить, онлайн ли наш Робот или нет. */ if (message.From != "0") { // Пока что все запросы идут на Сервер, в будущем будет не так. await _serverConnector.SendMessageToServer(message); // запрос на получение всех сообщений if (message.HasCommand(Mail)) { Robot robot = data.Robots.First(x => x.Number == message.From); var messages = data.Messages.Where(x => x.Robot.RobotID == robot.RobotID); Console.WriteLine("We have {0} messages", messages.Count()); foreach (var mes in messages.ToList()) { await _robotConnector.SendMessageToRobotTask(mes.Text); await data.RemoveAsync(mes); } } /* * Запускаем таску, которая шлет эхо сообщения на робота и * останавливается, если при передаче происзошла ошибка. */ Task heartBeating = Task.Factory.StartNew(() => { _robotConnector.SendEcho(message.From).Start(); }); } // сообщение от сервера. else { // сначала найдем этого Робота в базе. Robot robot = data.Robots.First(x => x.Number == message.To); // если онлайн и сообщение до него дошло, то ОК. if (robot.isOnline && await _robotConnector.SendMessageToRobotTask(JsonConvert.SerializeObject(message))) { } // если Робот сейчас не online или недоступен, то сохраним сообщение в БД else { await data.AddAsync(new StoredMessage() { Robot = robot, Text = message.Text }); } } }