private async Task <bool> SendMessage(string messageText) { Debug.WriteLine("starting sendmessage"); try { if (messageText != string.Empty) { var now = Util.CurrentTimeMillis(); SignalMessage message = new SignalMessage() { Author = null, ComposedTimestamp = now, Content = new SignalMessageContent() { Content = messageText }, ThreadId = SelectedThread.ThreadId, ReceivedTimestamp = now, Direction = SignalMessageDirection.Outgoing, Read = true, Type = SignalMessageType.Normal }; Debug.WriteLine("keydown lock await"); using (await ActionInProgress.LockAsync()) { Debug.WriteLine("keydown lock grabbed"); /* update in-memory data */ SelectedThread.MessagesCount += 1; SelectedThread.UnreadCount = 0; SelectedThread.LastMessage = message; SelectedThread.LastSeenMessageIndex = SelectedThread.MessagesCount; SelectedThread.View.UpdateConversationDisplay(SelectedThread); var container = new SignalMessageContainer(message, (int)SelectedThread.MessagesCount - 1); View.Thread.Append(container, true); MoveThreadToTop(SelectedThread); /* save to disk */ await Task.Run(() => { SignalDBContext.SaveMessageLocked(message); }); /* add to OutgoingCache */ View.Thread.AddToOutgoingMessagesCache(container); /* send */ OutgoingQueue.Add(message); } Debug.WriteLine("keydown lock released"); } return(true); } catch (Exception ex) { Debug.WriteLine(ex); Debug.WriteLine(ex.Message); Debug.WriteLine(ex.StackTrace); return(false); } }