gpt4 book ai didi

c# - SmtpClient.SendMailAsync 方法线程安全吗?

转载 作者:太空狗 更新时间:2023-10-29 22:19:28 24 4
gpt4 key购买 nike

SmtpClient Class指出实例成员不是线程安全的。如果对 Send 进行并发调用,则可以看到这一点或 SendAsync .如果第一次调用尚未完成,这两种方法都将在第二次调用时抛出 InvalidOperationException。

方法SendMailAsync .NET 4.5 中引入的 未将 InvalidOperationException 列为抛出的异常。新的 .NET 4.5 方法是否实现某种排队? Reflector 无法阐明此类的实现细节,因此我假设它已在 native 方法中实现。

多个线程能否在 SMTP 客户端的共享实例上安全地调用 SendMessageAsync 方法?

最佳答案

我不确定为什么使用 Reflector 对您不起作用。如果我反编译它,我会看到以下代码:

[HostProtection(SecurityAction.LinkDemand, ExternalThreading=true)]
public Task SendMailAsync(MailMessage message)
{
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
SendCompletedEventHandler handler = null;
handler = delegate (object sender, AsyncCompletedEventArgs e) {
this.HandleCompletion(tcs, e, handler);
};
this.SendCompleted += handler;
try
{
this.SendAsync(message, tcs);
}
catch
{
this.SendCompleted -= handler;
throw;
}
return tcs.Task;
}

如您所见,它是 SendAsync() 的简单 TAP 包装器。如果 SendAsync() 抛出异常,SendMailAsync() 只会重新抛出它。

因此,结论是 SendMailAsync() 不是线程安全的,并且它的异常未被充分记录。

关于c# - SmtpClient.SendMailAsync 方法线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15888279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com