我们正在使用topshelf / windsor / masstransit编写一个线程服务来从MSMQ中接收消息,然后发送带有PDF附件的电子邮件。
SmtpClient.Send()方法每次都会抛出此错误消息:
异步调用已在进行中。必须先完成或取消,然后才能调用此方法。
我在Windsor中将SmtpClient设置为.LifeStyle.Transient,所以我的理解是每个线程都应该有自己的实例吗?
任何想法如何解决这个问题,而不是锁定代码的那一部分。哪种方式会破坏线程的目的。
提前致谢
答案 0 :(得分:4)
Transient
不应该只是为每个线程创建一个新实例,而是为每个请求创建一个新实例。
我试着确认你真的得到了一个新的SmtpClient实例 - 确保你没有把它粘在静态字段中,或者以某种方式以相同的引用结束。每次发送电子邮件时,您都可以尝试将结果从GetHashCode()
吐出到控制台中,看看他们是否全部使用相同的对象。
如果做不到这一点,我唯一的建议是尝试将其删除为一个非常简单的示例 - 如果您在执行此操作时未发现问题,则可以在此处发布代码,但有人可能会提供帮助。