c# - 线程化 Windows 服务 - SmtpClient 问题

标签 c# multithreading castle-windsor smtpclient

我们正在使用 topshelf/windsor/masstransit 编写一个线程服务,从 MSMQ 中获取消息,然后发送带有 PDF 附件的电子邮件。

SmtpClient.Send() 方法时不时地抛出此错误消息:

An asynchronous call is already in progress. It must be completed or canceled before you can call this method.

我在 Windsor 中将 SmtpClient 设置为 .LifeStyle.Transient,所以我的理解是每个线程都应该获得自己的实例?

知道如何解决这个问题,除了锁定那部分代码之外。这会违背线程的目的。

提前致谢

最佳答案

Transient 不应该只为每个线程创建一个新实例,而应该为每个请求创建一个新实例。

我会尝试确认您确实获得了 SmtpClient 的新实例 - 确保您没有将其粘贴在静态字段中,或者以某种方式以相同的引用结束。您可以尝试在每次发送电子邮件时将 GetHashCode() 的结果吐入控制台,以查看它们是否都使用同一个对象。

如果做不到这一点,我唯一的建议是尝试将其简化为一个非常简单的示例 - 如果您在执行此操作时没有发现问题,您可以在此处发布代码,有人可能会提供帮助。

关于c# - 线程化 Windows 服务 - SmtpClient 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5144023/

相关文章:

c# - 从 C# 到 C++/CLI 的代码转换错误

c# - 是否可以(使用 Moq)对带有 Lambda 参数的方法调用进行 stub ?

c# - 将 XML 反序列化为对象数组

mvvm - 使用IoC在 View 模型中创建NHibernate存储库

caSTLe-windsor - MassTransit 2.6.1 请求/响应模式 - 响应超时

c# - 为什么 Parallel.Invoke 无法完成所有操作?

android - 同步块(synchronized block)android

Python - 命令执行的 wxPython 序列

android - Notification 操作启动的 IntentService 在哪个线程中运行?

caSTLe-windsor - CaSTLe Scoped Lifestyle 不起作用