public void WriteRawMessage(string rawMessage, bool whisper = false, bool needWait = false) { var container = new MessageContainer(rawMessage); if (whisper) { Task.Run(() => { var added = false; while (!IsCanSendWhisper(container, TokenSource.Token, ref added)) Thread.Sleep(1000); TokenSource.Token.ThrowIfCancellationRequested(); WriteMessage(container); }, TokenSource.Token); return; } Action action = () => { var added = false; while (!IsCanSendMessage(container, TokenSource.Token, needWait, ref added)) Thread.Sleep(1000); if (!needWait) TokenSource.Token.ThrowIfCancellationRequested(); WriteMessage(container); }; if (needWait) { var task = Task.Run(action); task.Wait(); } else { Task.Run(action, TokenSource.Token); } }
private static bool IsCanSendWhisper(MessageContainer messageContainer, CancellationToken token, ref bool added) { lock (LockForCheckWhisper) { if (!added) { WhisperContainers.Add(messageContainer); added = true; } if (token.IsCancellationRequested) { WhisperContainers.Remove(messageContainer); token.ThrowIfCancellationRequested(); } var timeCheckSecond = DateTime.Now.AddSeconds(-1); var timeCheckMinute = DateTime.Now.AddSeconds(-60); var countSecond = 0; var countMinute = 0; var copy = WhisperContainers.ToList(); foreach (var message in copy) { if (message.Time > timeCheckSecond) countSecond++; } foreach (var message in copy) { if (message.Time > timeCheckMinute) countMinute++; else WhisperContainers.Remove(message); } return countSecond < (int)WhisperLimit.PerSecond && countMinute < (int)WhisperLimit.PerMinute; } }
private void WriteMessage(MessageContainer messageContainer) { lock (LockForSend) { messageContainer.Time = DateTime.Now; _textWriter.WriteLine(messageContainer.Message); _textWriter.Flush(); } }
private static bool IsCanSendMessage(MessageContainer messageContainer, CancellationToken token, bool needWait, ref bool added) { lock (LockForCheckMessage) { if (!added) { MessageContainers.Add(messageContainer); added = true; } if (token.IsCancellationRequested && !needWait) { MessageContainers.Remove(messageContainer); token.ThrowIfCancellationRequested(); } var timeCheck = DateTime.Now.AddSeconds(-30); var count = 0; var copy = MessageContainers.ToList(); foreach (var message in copy) { if (message.Time > timeCheck) count++; else MessageContainers.Remove(message); } return count < (int)GlobalMessageLimit; } }