繁体   English   中英

快速连续异步发送多封电子邮件

[英]Sending multiple e-mails asynchronously in quick succession

我正在使用 ASP.NET Core MVC 3.1 开发 Web 应用程序,使用 Visual Studio 2019 社区版,版本 16.8.0(更新于 2020 年 11 月 11 日)。

在此应用程序中,管理员可以将用户输入到数据库中。 每当输入用户时,都会在后台向该用户发送一封电子邮件。 为防止确认页面的显示延迟,电子邮件消息以异步方式发送。 这工作正常,除非管理员快速连续输入多个用户。 然后只有一两封邮件被发送,因为电子邮件服务器对可以同时使用的线程数施加了限制。

如果有人能告诉我如何处理这个问题,我将不胜感激。

这是我当前代码的一些背景:

首先,有一个用于将用户插入数据库的函数。 如果插入成功,此函数将调用另一个函数,该函数向新用户发送一封电子邮件。

插入函数具有以下模式:

    void InsertUser(...)
    {
        // Insertion code here
    
        // If operation successful:
        Task t = SendGreetingsAsync(...);
    }

如您所见,InsertUser(...) 不会“等待”SendGreetingsAsync(...)。 如果这样做,异步性的好处将丧失。 至少,这是我的理解。

SendGreetingsAsync(...) 调用函数 SendGreetings(...) 像这样:

    async Task SendGreetingsAsync(...)
    {
        await Task.Delay(1);
        SendGreetings(...);
    }

SendGreetings(...) 是以下模式的同步函数:

    void SendGreetings(...)
    {
        // Send an e-mail to the user specified in the parameter list
    }

概括地说,问题是如何在快速连续输入多个用户时防止由于后台电子邮件消息导致的显示延迟,而不会导致电子邮件端出现问题。

任何帮助将不胜感激!

使用SemaphoreSlim通过代码路径限制并发。

async Task SendGreetingsAsync(...)
{
    try 
    {
      await semaphore.WaitAsync();
      SendGreetings(...);
    }
    finally
    {
      semaphore.Release();
    }
}

或者将电子邮件添加到BlockingCollection并让一个后台线程发送所有电子邮件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM