public async Task SendChatMessage(string threadId, int recipientId, string message) { int senderId = int.Parse(Context.User.FindFirst(ClaimTypes.NameIdentifier).Value); var isRecipientFocusingOnThisConversation = false; var recipientFocusingConversationList = new List <int>(); if (userFocusingMessageThreads.TryGetValue(recipientId, out recipientFocusingConversationList)) { isRecipientFocusingOnThisConversation = recipientFocusingConversationList.Contains(senderId); } var messageToSave = new Message(senderId, recipientId, message); var messageToSent = new MessageForReceive() { ThreadId = threadId, SenderId = senderId, RecipientId = recipientId, MessageContent = message, MessageSent = messageToSave.MessageSent }; int?unreadMessageTotalCountOughtToBeNotifiedToRecipient = await repository.AddMessageToThread(messageToSave, ObjectId.Parse(threadId), isRecipientFocusingOnThisConversation); var tasks = new List <Task>(); tasks.Add(Clients.Group(recipientId.ToString()).SendAsync("ReceiveMessage", messageToSent)); tasks.Add(Clients.Group(senderId.ToString()).SendAsync("ReceiveMessage", messageToSent)); if (unreadMessageTotalCountOughtToBeNotifiedToRecipient.HasValue) { tasks.Add(Clients.Group(recipientId.ToString()).SendAsync( "ReceiveTotalUnreadMessageCount", unreadMessageTotalCountOughtToBeNotifiedToRecipient.Value )); } await Task.WhenAll(tasks); }