简短的问题:
如果"工厂"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接到电话。 因此,如果您还有一些工作要做,您可以将其保留为注册