0

我正在将我的一些代码重构为一个服务,并且我打算将异步一直滚动到我的 EmailService 的 Send() 方法。我正要用 SendAsync() 替换 Send() 并注意到额外的回调参数。好吧,决定在这里深入了解一下:

https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient.sendasync?view=netcore-3.1#definition

我认为这对于在发生错误时设置日志记录到数据库很有用:

if (e.Error != null)
{
    Console.WriteLine("[{0}] {1}", token, e.Error.ToString());
    // TODO: Log error to DB
}

e.Cancel 永远不会发生。

我唯一关心的是记录错误和发送的消息。因为示例控制台程序说消息已发送,即使我说端口错误并且消息没有通过。它报告错误的唯一一次是 ArgumentNullException 或 InvalidOperationException。

所以发送的日志消息可能是错误的。但是没有办法确定消息是否发送,因为它返回 void 而不是成功布尔值。我想这比将 Send() 放在更昂贵的 try/catch 中要好。

一种替代方法是将回调设置为空的 SendCompletedCallback() 并使用以下命令:

private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
{
    // Do nothing
}

然后我们在我们的电子邮件中获得异步非阻塞的好处,并在需要时为回调设置基础设施。但目前我们并未被迫添加任何功能。

我在这里思考这个是否正确。我想我会采用这种方法。

4

1 回答 1

0

我找到了

SendMailAsync()

方法效果最好。您不需要回调或用户令牌。易于实施且无阻塞。

于 2020-09-16T22:32:53.010 回答