我有一個頁面的應用程序與Angular.js front,web api2後端,也使用Castle Windsor和SignalR。HttpApplication不退出
我在維護服務器狀態的服務器上使用c#組件。因此,在Application_Start()上,我將Castle Windsor的主要組件註冊爲Singleton。
IoC.Container.Register(Component.For(typeof(MainManager)).ImplementedBy(typeof(MainManager)).LifeStyle.Singleton);
(但是,我測試PerWebRequest和一些其他的生活方式,但主要問題仍然是相同的,所啓動的任務不退出)
然後在我的網絡API,我可以對該實例執行命令。
[HttpGet]
public void StartProcess(Params p) {
IoC.Resolve<MainManager>().StartOperation(p);
}
而這也給了我機會,從網站停止它通過調用另一個控制器方法
[HttpGet]
public void Stop() {
IoC.Resolve<MainManager>().RequestStop();
}
這大部分的偉大工程。但是,有時我的應用程序處於不良狀態(由於多種原因,它可以在產品中重新啓動)我可以通過在運行操作期間修改web.config來模擬此問題,因此很多事情都會重置(例如Signal- R連接),但主要操作不會停止運行。 (事實上,一旦我的應用程序處於不良狀態,我不能再調用Stop控制器方法,因爲MainManager已被重置,所以現在停止它的唯一方法是重置整個IIS。不想)
我想弄清楚如何檢測這種狀態,並終止正在運行的過程。
作爲一個可能的解決方案,我用綁定生活方式(在溫莎城堡3個新的),我的經理試圖範圍到我的網頁API HttpApplication的試驗,但還沒有運氣。
更新
我試圖使主要任務方法靜態
[HttpGet]
public void Start(ForceData data) {
MainManager.Start(data);
}
我相信這應該拿出一個實例,該出方程,但代碼仍然運行觸摸網在未中斷的.config
更新
將MainManager類帶出等式。我的所有web api方法現在都是循環+睡眠
[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 request lifecycle找出此時這個請求轉到殭屍胭脂
更改線程以使它們將'IsBackground'設置爲true。 'MainManager.Stop()'將在正常退出時正常停止它們,'thread.IsBackground'將確保應用程序在失敗時可以關閉。 – jgauffin
@jgauffin我沒有明確地產生任何線程。你是說我應該開始這樣做,以設置該屬性? –
後臺線程會工作,但如果我必須產生一個新的線程,這將改變諸如身份/安全等。我的應用程序目前依賴於httpcontext等..是否有可能創建一個與當前線程相同的一切後臺線程? –