我正在将我的一些代码重构为一个服务,并且我打算将异步一直滚动到我的 EmailService 的 Send() 方法。我正要用 SendAsync() 替换 Send() 并注意到额外的回调参数。好吧,决定在这里深入了解一下:
我认为这对于在发生错误时设置日志记录到数据库很有用:
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
}
然后我们在我们的电子邮件中获得异步非阻塞的好处,并在需要时为回调设置基础设施。但目前我们并未被迫添加任何功能。
我在这里思考这个是否正确。我想我会采用这种方法。