C# HttpApplication没有退出
我有一个单页应用程序,前面是Angular.js,后面是web api2,也使用Castle Windsor和Signal 我在服务器上使用一个c#组件来维护服务器状态。因此,在应用程序_Start()中,我将Castle Windsor的主组件注册为SingletonC# HttpApplication没有退出,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我有一个单页应用程序,前面是Angular.js,后面是web api2,也使用Castle Windsor和Signal 我在服务器上使用一个c#组件来维护服务器状态。因此,在应用程序_Start()中,我将Castle Windsor的主组件注册为Singleton IoC.Container.Register(Component.For(typeof(MainManager)).ImplementedBy(typeof(MainManager)).LifeStyle.Singleton);
IoC.Container.Register(Component.For(typeof(MainManager)).ImplementedBy(typeof(MainManager)).LifeStyle.Singleton);
(不过,我测试了PerWebRequest和其他几种生活方式,但主要问题仍然是,启动的任务不会退出)
然后在我的Web Api中,我可以对该实例执行命令
[HttpGet]
public void StartProcess(Params p) {
IoC.Resolve<MainManager>().StartOperation(p);
}
我相信这应该可以将singleton实例从等式中去掉,但是在触摸web.config之后,代码仍然可以不间断地运行
更新
将MainManager类排除在外。我的WebAPI方法现在所做的就是循环+睡眠
[HttpGet]
public void Start(ForceData data) {
foreach (var e in data.Members)
{
_log.Info("processing member: {0}", e.Email);
Thread.Sleep(1000);
}
}
触摸web.config后,此循环也不会中断
所以,在这一点上,我正在阅读有关MVC的文章,以找出这个请求在哪一点会变成僵尸胭脂(zombie rouge)这是设计上的,因为当应用程序重新启动时,HttpApplication实例不会立即释放 当需要重新启动应用程序时,ASP.NET将在重新启动应用程序域并加载新程序集之前,为来自现有应用程序域和旧程序集的所有挂起请求提供服务
在所有示例Web API方法中,您都可以看到线程仍然繁忙,这意味着ASP.NET运行时认为此请求仍在处理中。更改线程,以便将
IsBackground
设置为trueMainManager.Stop()
将在正常退出时优雅地停止它们,并且thread.IsBackground
将确保应用程序在出现故障时可以关闭。@jgauffin我没有显式生成任何线程。。你是说我应该开始这样做以设置该属性吗?后台线程可以工作,但如果我必须生成一个新线程,这将改变诸如身份/安全性之类的事情。我的应用程序目前依赖于httpcontext等。。是否可以创建一个后台线程,其他所有内容都与当前线程相同?凭据将自动复制到新线程(不确定模拟情况)@jgauffin not httpcontext。我试着手动分配,但似乎不那么容易。你知道一种检测方法吗?Application\u End未触发正如同一篇文章中隐含的那样,Application\u End
仅在所有挂起的请求都得到服务时才被调用。因此,应用程序很难检测到重启。一般来说,您应该放弃当前的同步方法,并测试异步支持在这种情况下是否有帮助,以及。它们应该能让你更好地控制你的任务。
[HttpGet]
public void Start(ForceData data) {
MainManager.Start(data);
}
[HttpGet]
public void Start(ForceData data) {
foreach (var e in data.Members)
{
_log.Info("processing member: {0}", e.Email);
Thread.Sleep(1000);
}
}