首页 > 解决方案 > 同时监控多个 IMAP 邮箱 C#

问题描述

我有一个 .NE|T Core 3 Web 应用程序,它需要同时监控 1000 个邮箱。我需要在收到电子邮件后立即采取行动。我创建了一个后台服务,该服务围绕要监视的邮箱循环,然后为每个邮箱创建一个在程序期间运行的任务。任务引用在循环中被丢弃,但传入取消令牌以清理事件处理程序并在应用程序停止时关闭连接。我正在使用 MailKit 来监视使用 IMAP IDLE 客户端的邮箱,请参见此处

foreach (var mailAccount in mailAccountsToMonitor)
{
    // ConcurrentDictionary
    if (mailAccountMonitorTasks.ContainsKey(mailAccount.Id)) continue;
    // NOT awaiting the result as these tasks run indefinitely and won't finish until the CancellationToken is cancelled
    _ = MonitorMailAccount(mailAccount, cancellationToken);
}

我有一个异步方法,只要有消息从邮箱传来,就会调用它。这会将邮件项添加到数据库并执行其他一些小任务。我试图使方法占用空间小。

private async Task OnMessagesAddedAsync(object sender, MessagesAddedEventArgs args)
{
    // perform database insert and other conditional logic
}

上面的方法作为空闲客户端的事件处理程序附加,如下所示:idleClient.MessagesAddedAsync += OnMessagesAddedAsync; 我在空闲客户端中使用事件委托的异步版本:public event Func<object, MessagesAddedEventArgs, Task> MessagesAddedAsync;

我担心这不会扩展到数千个邮箱,而且我已经开始面临奇怪的问题——尽管这可能是由于我缺乏对多线程的深入了解,而不是这种设计的问题?

在不面临线程池耗尽、套接字和数据库异常等问题的情况下,执行数千个长时间运行的事件驱动任务的正确方法是什么?有没有比我已经拥有的更好的方法来设计这个?

标签: c#imapmailkit

解决方案


推荐阅读