谢谢各位的意见。我这样做的方式,因此其他人可以将其视为解决方案:
排队可能是最“正确”的方法,但它需要一些额外的实现,这对于我打算做的事情来说确实是最重要的。使用来自http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx的信息
首先,我创建我的处理类,并在从客户端获取 XML 后在后台线程中启动它以完成工作。当我的工作线程在后台继续时,这会释放连接。
我将我的处理类注册为IRegisteredObject
. 我实现了这个Stop(bool immediate)
方法
public void Stop(bool immediate)
{
if (!immediate && _working)
return;//don't unregister yet, give it some time
if(immediate && _working)
{
//TODO: Log this instance
}
HostingEnvironment.UnregisterObject(this);
}
我在处理工作时将我的 _working 变量设置为 true,并在完成后取消设置。如果在极少数情况下我正在处理工作并且因为 AppDomain 被删除而调用 stop ,它首先会返回而不注销自身。这让我的过程有更多的时间来完成。如果在第二次调用该方法并将立即标志设置为 true 时,它会快速记录问题,然后自行注销。
这可能不是最终的解决方案,但出于我的目的,这将负责在非常罕见的情况发生时提醒我,并且在我处理数据时不会阻止客户端的连接。