bri*_*cht 5 c# async-await .net-4.5
该SmtpClient类规定,实例成员不是线程安全的.如果对Send或SendAsync进行并发调用,则可以看到这一点.如果第一个尚未完成,则两个方法都会在第二次调用时抛出InvalidOperationException.
.NET 4.5中引入的方法SendMailAsync不会将InvalidOperationException列为抛出异常.新的.NET 4.5方法是否实现某种排队?Reflector无法阐明这个类的实现细节,因此我假设这已经在本机方法中实现.
多个线程可以安全地调用SMTP客户端的共享实例上的SendMessageAsync方法吗?
svi*_*ick 10
我不确定为什么使用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;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它是一个简单的TAP包装器SendAsync().如果SendAsync()抛出异常,SendMailAsync()只需重新抛出即可.
因此,结论是SendMailAsync()不是线程安全的,并且其例外情况未被记录.