Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 快速连续异步发送多封电子邮件_C#_Email_Asp.net Core_Asynchronous - Fatal编程技术网

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

C# 快速连续异步发送多封电子邮件,c#,email,asp.net-core,asynchronous,C#,Email,Asp.net Core,Asynchronous,我正在使用Visual Studio 2019社区版16.8.0(于2020年11月11日更新)开发一个具有ASP.NET核心MVC 3.1的Web应用程序 在此应用程序中,管理员可以将用户输入数据库。无论何时输入用户,都会在后台向该用户发送电子邮件。为防止确认页面显示延迟,将异步发送电子邮件。除非管理员连续快速输入多个用户,否则此操作正常。然后只发送一到两条消息,因为电子邮件服务器对可同时使用的线程数量施加了限制 如果有人能告诉我如何处理这个问题,我将不胜感激 以下是我当前代码的一些背景信息:

我正在使用Visual Studio 2019社区版16.8.0(于2020年11月11日更新)开发一个具有ASP.NET核心MVC 3.1的Web应用程序

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

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

以下是我当前代码的一些背景信息:

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

插入函数具有以下模式:

    void InsertUser(...)
    {
        // Insertion code here
    
        // If operation successful:
        Task t = SendGreetingsAsync(...);
    }
    void SendGreetings(...)
    {
        // Send an e-mail to the user specified in the parameter list
    }
如您所见,InsertUser(…)不“等待”SendGreetingsAsync(…)。如果这样做了,异步性的好处就会丧失。至少,这是我的理解

SendGreetingsSync(…)调用函数SendGreetings(…),如下所示:

    async Task SendGreetingsAsync(...)
    {
        await Task.Delay(1);
        SendGreetings(...);
    }
SendGreetings(…)是以下模式的同步函数:

    void InsertUser(...)
    {
        // Insertion code here
    
        // If operation successful:
        Task t = SendGreetingsAsync(...);
    }
    void SendGreetings(...)
    {
        // Send an e-mail to the user specified in the parameter list
    }
概括地说,问题是如何防止在几个用户快速连续输入时由于后台电子邮件消息而导致显示延迟,而不会在电子邮件端造成问题

任何帮助都将不胜感激

用于通过代码路径限制并发性

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

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

如果您正在发送电子邮件,您需要将其存储在某个位置,以便能够重试。SMTP服务器临时拒绝您的电子邮件有绝对有效的原因,除了您遇到的原因之外,在这种情况下,您必须稍后重试。或者,您可以使用适当的SMTP服务器为您执行此操作。从web应用程序发送电子邮件的方式是“火和忘记”是非常不可靠的。感谢您的建议和如此迅速的响应。你能解释一下如何“使用合适的SMTP服务器为你做这件事”吗?非常感谢你,大卫。我将仔细阅读这些工具,这是我以前从未听说过的。