private ChannelQuestionAndAnswer FindQuestionAndAnswer(string message) { if (string.IsNullOrEmpty(message)) { return(null); } if (_qas.ContainsKey(message)) { return(_qas[message]); } var timeLength = TimeFormat.Length; var qHeaderLength = QuestionHeader.Length; var aHeaderLenght = AnswerHeader.Length; if (message.Length >= (timeLength + qHeaderLength)) { DateTime time; if (DateTime.TryParse(message.Substring(0, timeLength), out time)) { var header = message.Substring(timeLength, qHeaderLength); if (header == QuestionHeader) { var content = message.Substring(timeLength + qHeaderLength); var isQuestioner = false; var key = GetQuestionAndAnswerKey(time, isQuestioner); lock (_qaLocker) { if (_qas.ContainsKey(key)) { return(_qas[key]); } var qa = new ChannelQuestionAndAnswer(this, content, time, isQuestioner); _qas.Add(key, qa); return(qa); } } else { header = message.Substring(timeLength, aHeaderLenght); if (header == AnswerHeader) { var content = message.Substring(timeLength + aHeaderLenght); var isQuestioner = true; var key = GetQuestionAndAnswerKey(time, isQuestioner); lock (_qaLocker) { if (_qas.ContainsKey(key)) { var qa = _qas[key]; qa.Answer = content; qa.AnswerTime = DateTime.Now; return(qa); } } } } } } return(null); }
public async Task <IAnswerResult> Request(string question, int timeoutMilliseconds) { RefreshQA(); var qa = new ChannelQuestionAndAnswer(this, question, DateTime.Now, true); var key = this.GetQuestionAndAnswerKey(qa); var message = GetQuestionMessage(qa); lock (_qaLocker) { if (_qas.ContainsKey(key) == false) { _qas.Add(key, qa); } else { return(new AnswerResult(false, "请求重复!")); } } var time = 0; do { await this.Send(message); await Task.Delay(500); time += 500; } while (qa.IsAnswered == false && time < timeoutMilliseconds); var isAnswered = qa.IsAnswered; var response = isAnswered ? qa.Answer : "超时未响应"; return(new AnswerResult(isAnswered, response)); }
public async Task Answer(ChannelQuestionAndAnswer answer) { if (answer != null && answer.IsAnswered) { var message = GetAnswerMessage(answer); await this.Send(message); } }
public string GetAnswerMessage(ChannelQuestionAndAnswer answer) => answer.IsAnswered ? $"{answer.QuestionTime.ToString(TimeFormat)}{AnswerHeader}{answer.Answer}" : null;
public string GetQuestionMessage(ChannelQuestionAndAnswer answer) => $"{answer.QuestionTime.ToString(TimeFormat)}{QuestionHeader}{answer.Question}";
private string GetQuestionAndAnswerKey(ChannelQuestionAndAnswer answer) => $"{answer.QuestionTime.ToString(TimeFormat)}{(answer.IsQuestioner ? "Q" : "A")}";