Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpApplication没有退出_C#_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

C# HttpApplication没有退出

C# 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);

我有一个单页应用程序,前面是Angular.js,后面是web api2,也使用Castle Windsor和Signal

我在服务器上使用一个c#组件来维护服务器状态。因此,在应用程序_Start()中,我将Castle Windsor的主组件注册为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
设置为true
MainManager.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);
  }
}