如何正确停止 ASP.NET 注册的对象工厂



简短的问题:

如果"工厂"IRegisteredObject是假的immediate,我应该取消注册IRegisteredObject.Stop吗?

痛苦的长版本:

有时在 ASP.NET 应用中,您希望"触发并忘记"后台进程。

IIS 偶尔会回收 ASP.NET 应用程序。如果您只是触发一个Task.Run,则当回收发生时,您的后台进程将消失。

为了减少后台工作的消失,您可以实施IRegisteredObject并注册它 ASP.NET 以便在回收之前提供您的后台工作公平警告。

ASP.NET 在任何给定时间只会注册给定类型的一个IRegisteredObject。因此,要处理同一类型的多个IRegisteredObject,必须实现"工厂"IRegisteredObject来管理队列。

以下是我对MSDN示例工厂IRegisteredObject的改写:

public class Factory : IRegisteredObject 
{
private List<Work> workItems = new List<Work>;
public void Start()
{
HostingEnvironment.RegisterObject(this);
}
void IRegisteredObject.Stop(bool immediate)
{
foreach (Work w in workItems)
{
// Inform each work item ASP.NET has to recycle.
w.Stop(immediate);
}
// Unregister this factory object.
// Should we do this if !immediate ???
HostingEnvironment.UnregisterObject(this);
}
public AddWork(Work w)
{
w.Init();
workItems.Add(w);
return w;
}
}
public class Work : IRegisteredObject
{
void IRegisteredObject.Stop(bool immediate)
{
// If not immediate, start wrapping up.
// If immediate, wrap up quickly.
}
public void Init()
{
// Do things to start working.
}
}

在 Factory.Stop 中,工厂IRegisteredObject将在Work项目收到第一条(非immediate("停止"消息后取消注册。

我们不应该等到immediate == true取消注册,这样 ASP.NET 仍然会意识到一些工作可能仍在进行中吗?

不,你不能。这就是为什么你可以用即时==true接到电话。 因此,如果您还有一些工作要做,您可以将其保留为注册

最新更新