Как не дублировать отправку письма при одновременных http запросах

Сейчас есть текущая реализация такая: приходят N HTTP запросов, прямо друг за другом (конкретно не больше 5). В обработчике HTTP запроса отправляется email. Соответственно сейчас email отправляется N раз — по количеству запросов.

Необходимо исправить — чтобы email отправлялся только 1 раз — не смотря на N запросов Привожу тестовую реализацию (реальный код не могу прислать). При первом запросе статический флаг устанавливается в true – таким же он останется и при последующих запросах. Тут же запускается таймер. Через безопасный интервал флаг сбрасывается. Интервал — это примерное время, через которое пользователь опять инициирует действия, вызвавшее отправку email

Я бы хотел избавиться от таймера и флага — нужно как-то отслеживать сколько запросов и каких пришло. Как это сделать и можно ли?

Ещё вариант который вижу — хранить в БД признак, но не хотелось бы этого делать.

public class HomeService
{
    private static bool _isMessageSent = false;
    private Timer aTimer;

    public void SetIsMessageSent()
    {
        SetTimer();
        _isMessageSent = true;
    }

    private static void ResetIsMessageSent()
    {
        _isMessageSent = false;
    }

    private void SetTimer()
    {
        aTimer = new Timer(20000);
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = false;
        aTimer.Enabled = true;
    }

    private void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        ResetIsMessageSent();
        aTimer.Stop();
        Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
                          e.SignalTime);
    }
}



public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private readonly HomeService _homeService;
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
        _homeService = new HomeService();
    }

    public IActionResult Index()
    {
        _homeService.SetIsMessageSent();
        return View();
    }

Ответы (0 шт):