在尝试在我的ASP.Net MVC 3应用程序中通过smtp实现异步电子邮件时,我遇到了SO SmtpClient.SendAsync blocking my ASP.NET MVC Request线程。在那里我找到了Phil Haack的文章:The Dangers of Implementing Recurring Background Tasks In ASP.NET,它提供了一种方法来避免后台线程在AppDomain关闭时崩溃。
文章说要在构造函数上调用HostingEnvironment.RegisterObject(this);
并仅在调用IRegisteredObject.Stop Method时调用HostingEnvironment.UnregisterObject(this);
。
在一般情况下,当请求永久到达,并且实现IRegisteredObject
的对象的范围是请求时,这种方法是不是在每个请求中注册对象(利用电子邮件功能)并且不注销任何内容?
可以吗?或者我应该在异步操作完成后取消注册吗?
P.S。:正如Damian Edwards在链接的SO问题中所建议的那样,我使用ThreadPool.QueueUserWorkItem
将电子邮件发送到请求范围之外。
答案 0 :(得分:0)
我不确定requests arrive permanently
,scope of the object ... is request
等等你的意思。
Request Scope
,permanent
和ThreadPool.QueueUserWorkItem
;这些话在一起根本没有意义。一个使用ThreadPool.QueueUserWorkItem
,因此请求不会永远。 Damian Edwards建议,当您的请求立即返回时,耗时的工作将在后台完成。
我已根据收到的请求使用IRegisterObject
发送批量电子邮件。但是,就我而言,我使用了一个实现EmailSender
的单例对象IRegisterObject
。在这种情况下,它在构造函数中注册一次,在Stop()
中注销一次。
因此,简而言之,请使用singleton。