c# - 快速连续异步发送多封电子邮件
问题描述
我正在使用 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
}
概括地说,问题是如何防止在快速连续输入多个用户时由于后台电子邮件消息而导致显示延迟,而不会导致电子邮件端出现问题。
任何帮助将不胜感激!
解决方案
使用SemaphoreSlim通过代码路径限制并发。
async Task SendGreetingsAsync(...)
{
try
{
await semaphore.WaitAsync();
SendGreetings(...);
}
finally
{
semaphore.Release();
}
}
或者将电子邮件添加到BlockingCollection并让单个后台线程发送所有电子邮件。
推荐阅读
- node.js - 当我尝试创建新事件(NodeJs / Mongoose)时,我的数据没有保留
- javascript - 无法对非静态字段 GrossPay 进行静态引用
- r - 如何更改 R fastlink 包中的模式?
- angular - 如何使用 OnIdentifyEffects 创建具有唯一标识符的 ngrx 效果?
- vba - 从文本框的值动态填充组合框的行源
- azure - Azure B2C | 密码重置发送到错误的 UserJourney
- matlab - 如何将 eps 插入乳胶中?
- powershell - 用于查找重复的 Windows 进程并杀死它们的 Powershell 脚本
- css - 是受元素本身字体大小影响的字体大小相对长度
- php - Wordpress 如何为自定义帖子类型执行嵌套/多级查询