我应该永远不要调用HostingEnvironment.UnregisterObject
本文关键字:HostingEnvironment UnregisterObject 调用 永远 我应该 | 更新日期: 2023-09-27 18:10:02
尝试在我的ASP中实现smtp异步电子邮件。Net MVC 3应用程序,我已经来到了SO SmtpClient。SendAsync阻塞我的ASP。NET MVC请求线程。在那里我找到了Phil Haack的文章:在ASP中实现重复的后台任务的危险。它提供了一种避免AppDomain关闭时后台线程崩溃的方法。
文章说在构造函数上调用HostingEnvironment.RegisterObject(this);
,并且只在IRegisteredObject时调用HostingEnvironment.UnregisterObject(this);
。方法被调用。
在一般情况下,当请求永久到达时,并且实现IRegisteredObject
的对象的范围是请求,这种方法不注册每个请求中的对象(利用电子邮件功能)并且不取消注册任何对象吗?
可以吗?还是应该在异步操作完成后取消注册?
注::正如Damian Edwards在链接的SO问题中建议的那样,我使用ThreadPool.QueueUserWorkItem
发送超出请求范围的电子邮件。
我不知道你说的requests arrive permanently
, scope of the object ... is request
等是什么意思
Request Scope
, permanent
, and ThreadPool.QueueUserWorkItem
;这些词放在一起根本没有意义。一个人使用ThreadPool.QueueUserWorkItem
,这样请求就不会永远持续下去。这个耗时的工作是在后台完成的,而你的请求会像达米安·爱德华兹建议的那样立即返回。
我已经使用IRegisterObject
在收到请求时发送批量电子邮件。然而,在我的例子中,我使用了一个实现IRegisterObject
的单例对象EmailSender
。在这种情况下,它在构造函数中注册一次,在Stop()
中取消注册一次。
所以,简而言之,请使用单例。