public async Task ProcessMessage(Message inputMessage, string orderId) { _orderId = orderId; var order = await _db.GetCurrentOrder(_orderId); List <ModelResult> numberResults; bool isConfirming; double confirmingConfidence; //To multithreading? Or Task? inputMessage.CheckOnNumber(out numberResults); inputMessage.CheckConformation(out isConfirming, out confirmingConfidence); var processedStaged = false; // If the confidence is high enough it could be that the user is confirming. if (confirmingConfidence > 0.5 && order.StagedOrderDetails.Count > 0) { UpdateBasedOnConfirmation(isConfirming, confirmingConfidence); await _orderDialogResponseBuilder.Acknowledgement(isConfirming, confirmingConfidence); processedStaged = true; } // Determine which response to use. If found numbers respond to the numbers. if (numberResults.Count > 0) { UpdateBasedOnRecievedNumbers(numberResults, inputMessage.Words); await _orderDialogResponseBuilder.ImplicitConfirmation(numberResults, inputMessage.Words); } // Prompt for something else if (order.StagedOrderDetails.Count == 0 && processedStaged) { _orderDialogResponseBuilder.Prompt(); } else if (!isConfirming && confirmingConfidence > 0.9 && !processedStaged) { _orderDialogResponseBuilder.FinalizePrompt(); } else if (isConfirming && !processedStaged) { _orderDialogResponseBuilder.FillPrompt(); } // If there are none numbers found and user isn't confirming default resposne. if (numberResults.Count == 0 && confirmingConfidence < 0.5) { _orderDialogResponseBuilder.DefaultResponse(); } }