Я смотрел несколько видео на YT, в которых описывались Event Hanlders с помощью SMS Manager.Я хотел создать что-то похожее на Email Manager:
public class OfferEmailManager
{
public async void OnSecurityDepositAdded(object source, SecurityDepositEventArgs eventArgs)
{
EmailObject email = new EmailObject();
//preparing email object (subject, body, from, to)
var result = await EmailAPI.Instance.SendEmail(email);
}
private string PrepareSecurityDepositAddMail(SecurityDepositEventArgs eventArgs)
{
//preparing mail body
}
}
Кажется, что все выглядит хорошо, но отправка электронной почты происходит асинхронно, мне пришлось сделать OnSecurityDepositAdded
асинхронно.Я хочу отправить электронное письмо, когда SecurityDeposit
добавлено в базу данных на контроллере:
public EventHandler<SecurityDepositEventArgs> SecurityDepostAdded;
protected virtual void OnSecurityDepositAdded(SecurityDeposit securityDeposit, Offer offer)
{
SecurityDepositAdded?.Invoke(this, new SecurityDepositEventArgs()
{
//values
});
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> AddSecurityDeposit(SecurityDepositCreateViewModel model)
{
Offer offer = db.Offers.Find(model.ID);
OfferEmailManager manager = new OfferEmailManager();
SecurityDepositAdded += manager.OnSecurityDepositAdded;
SecurityDeposit securityDeposit = new SecurityDeposit()
{
// values
};
db.SecurityDeposits.Add(securityDeposit);
try
{
db.SaveChanges();
OnSecurityDepositAdded(securityDeposit, offer);
return RedirectToAction("Details", new { id = model.ID });
}
catch (Exception ex)
{
ViewBag.ErrorMessage = ex.Message;
return View(model);
}
}
В конце оно идеально подходит к return RedirectToAction
, и я получил письмо, но я также получил исключение
Асинхронный модуль или обработчик завершены, пока асинхронная операция еще не завершена
Как я могу обработать это исключение?