public async Task <IActionResult> SendSignupEmail([FromBody] dynamic param) { string link = null; AccountToken accountToken = null; Exception ex1 = null, ex2 = null; try { accountToken = Helper.JSonCamelDeserializeObject <AccountToken>(param); if (accountToken == null || accountToken.ID <= 0 || string.IsNullOrEmpty(accountToken.Value)) { throw new NullReferenceException(); } await Task.WhenAll( Helper.GetFunc(async() => { string lang = null; try { lang = LanguageManager.DEFAULT_LANGUAGE; link = Url.Action("xxXxx", "completeregistration", null, this.Request.Scheme); link += (link.EndsWith("/") ? "" : "/") + accountToken.Value; link = link.Replace("/xxXxx/", "/"); using (var mailService = this.GetMailService()) { await mailService.SendEmailAsync( $"{LanguageManager.GetLabel("AppTitle", lang)} {LanguageManager.GetLabel("lbl_CompleteReg", lang)}", LanguageManager.GetOther("email_SignUp", lang) .Replace("{1}", LanguageManager.GetLabel("AppTitle", lang)) .Replace("{2}", link), toEmail: accountToken.AddData, fromName: LanguageManager.GetLabel("AppTitle", lang), replyToEmail: "*****@*****.**", replyToName: "NO REPLY"); } } catch (Exception ex) { ex1 = ex; } finally { lang = null; } })(), Helper.GetFunc(() => { try { accountToken.RegisterForRecordStateChange(); accountToken.EmailSentStatus = EmailSatus.Sending; accountToken.UnregisterForRecordStateChange(); accountToken = _dbi.ManageModel(accountToken); } catch (Exception ex) { ex2 = ex; } return(Task.CompletedTask); })()); if (ex1 != null || ex2 != null) { accountToken.RegisterForRecordStateChange(); accountToken.EmailSentStatus = EmailSatus.SendFail; accountToken.UnregisterForRecordStateChange(); accountToken = _dbi.ManageModel(accountToken); if (ex1 != null) { throw ex1; } if (ex2 != null) { throw ex2; } } accountToken.RegisterForRecordStateChange(); accountToken.EmailSentStatus = EmailSatus.Sent; accountToken.UnregisterForRecordStateChange(); accountToken = _dbi.ManageModel(accountToken); return(Json(accountToken.Simplify())); } catch (Exception ex) { return(InternalServerError(ex)); } finally { link = null; } }