/// <summary> /// Sends given message to host asynchronously using TcpClient with given cancellation token. /// </summary> /// <remarks> /// Sunricher device does not accept messages with interval less than ~100ms, so this method will not run in parallel. /// Internally uses queue to send one message at time. /// </remarks> /// <exception cref="OperationCanceledException">Operation was cancelled during connection to device.</exception> public async Task SendMessageAsync(Byte[] message, CancellationToken cancellationToken) { void SendMessageAction() { if (cancellationToken.IsCancellationRequested) { return; //Return if already cancelled } var eventArgs = new LedMessageEventArgs(message); SendingMessage?.Invoke(this, eventArgs); if (_tcpClient == null) { _tcpClient = new TcpClient(); _tcpClient.ConnectAsync(_host, _port).Wait(cancellationToken); //Will throw if cancelled during connection } var writeTask = _tcpClient .GetStream() .WriteAsync(message, 0, message.Length, cancellationToken); // ReSharper disable MethodSupportsCancellation writeTask.Wait(); MessageSent?.Invoke(this, eventArgs); if (writeTask.Status == TaskStatus.RanToCompletion) { Task.Delay(DelayAfterMessage).Wait(); } // ReSharper restore MethodSupportsCancellation } await _serialQueue.Enqueue(SendMessageAction); }
public void SendCommand(Message message) { try { SendingMessage?.Invoke(message); } catch (Exception ex) { LogOutput.Instance.Write(ex); } _server.SendCommand(message.Command + ":" + message.Content); }
/// <summary> /// Отправка сообщения /// </summary> /// <param name="text">Текст сообщения</param> /// <param name="isSystem">Системное ли</param> /// <param name="receiver">Получатель</param> /// <param name="isPrivate">Приватное ли</param> public void SendMessage(string text, bool isSystem = true, string receiver = Constants.Everybody, bool isPrivate = false) { SendingMessage?.Invoke(this, new Message(text, Name, receiver, isSystem, isPrivate)); }