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

时间:2013-04-19 02:44:06

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asynchronous

在尝试在我的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将电子邮件发送到请求范围之外。

1 个答案:

答案 0 :(得分:0)

我不确定requests arrive permanentlyscope of the object ... is request等等你的意思。

Request ScopepermanentThreadPool.QueueUserWorkItem;这些话在一起根本没有意义。一个使用ThreadPool.QueueUserWorkItem,因此请求不会永远。 Damian Edwards建议,当您的请求立即返回时,耗时的工作将在后台完成。

我已根据收到的请求使用IRegisterObject发送批量电子邮件。但是,就我而言,我使用了一个实现EmailSender的单例对象IRegisterObject。在这种情况下,它在构造函数中注册一次,在Stop()中注销一次。

因此,简而言之,请使用singleton