我应该永远不要调用HostingEnvironment.UnregisterObject吗?

4
在尝试在我的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的对象的范围是请求时,这种方法是否会在每个请求中注册对象(利用电子邮件功能)并且不注销任何对象?

这样可以吗?还是说我也需要在异步操作完成后注销?

附言:如链接的SO问题中Damian Edwards所建议的,我使用ThreadPool.QueueUserWorkItem在请求范围之外发送电子邮件。

1个回答

0

我不确定你所说的“请求永久到达”、“对象的范围是请求”等是什么意思。

“请求范围”、“永久”和“ThreadPool.QueueUserWorkItem”这些词放在一起根本没有意义。使用“ThreadPool.QueueUserWorkItem”是为了避免请求花费太长时间。耗时的工作在后台完成,而您的请求会立即返回,就像Damian Edwards建议的那样。

我曾经使用“IRegisterObject”在收到请求时发送批量电子邮件。但是,在我的情况下,我使用了一个实现“IRegisterObject”的单例对象“EmailSender”。在这种情况下,它在构造函数中注册一次,在“Stop()”中取消注册。

因此,请使用singleton


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接