首页 > 解决方案 > 快速连续异步发送多封电子邮件

问题描述

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

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

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

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

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

插入函数具有以下模式:

    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
    }

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

任何帮助将不胜感激!

标签: c#emailasp.net-coreasynchronous

解决方案


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

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

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


推荐阅读