在 ASP.NET 中正確實現後台程序 Thread
我需要執行一個無限的 while 循環並希望在
global.asax. 我的問題是我應該怎麼做?我應該開始一個新執行緒還是應該使用 Async 和 Task 或其他任何東西?在while循環內我需要做await TaskEx.Delay(5000);我該如何做到這一點,這樣它就不會阻塞任何其他程序並且不會造成記憶體洩漏?
我使用 VS10、AsyncCTP3、MVC4
編輯:
public void SignalRConnectionRecovery() { while (true) { Clients.SetConnectionTimeStamp(DateTime.UtcNow.ToString()); await TaskEx.Delay(5000); } }只要應用程序可用,我需要做的就是在全域範圍內將其作為單例實例執行。
編輯:已解決
這是 Global.asax 中的最終解決方案
protected void Application_Start() { Thread signalRConnectionRecovery = new Thread(SignalRConnectionRecovery); signalRConnectionRecovery.IsBackground = true; signalRConnectionRecovery.Start(); Application["SignalRConnectionRecovery"] = signalRConnectionRecovery; } protected void Application_End() { try { Thread signalRConnectionRecovery = (Thread)Application["SignalRConnectionRecovery"]; if (signalRConnectionRecovery != null && signalRConnectionRecovery.IsAlive) { signalRConnectionRecovery.Abort(); } } catch { /// } }我發現這篇關於如何使用非同步工作者的好文章:http: //www.dotnetfunda.com/articles/article613-background-processes-in-asp-net-web-applications.aspx
這: http ://code.msdn.microsoft.com/CSASPNETBackgroundWorker-dda8d7b6
但我認為對於我的需要,這將是完美的: http ://forums.asp.net/t/1433665.aspx/1
我發現這篇關於如何使用非同步工作者的好文章,將嘗試一下。<http://www.dotnetfunda.com/articles/article613-background-processes-in-asp-net-web-applications.aspx>
這: http ://code.msdn.microsoft.com/CSASPNETBackgroundWorker-dda8d7b6
但我認為對於我的需要,這將是完美的: http ://forums.asp.net/t/1433665.aspx/1
ASP.NET 不是為處理這種要求而設計的。如果你需要一些東西來持續執行,你最好創建一個 Windows 服務。
更新
ASP.NET 不是為長時間執行的任務而設計的。它旨在快速響應 HTTP 請求。請參閱Cyborgx37 的答案或我可以使用執行緒在 IIS 上執行長時間執行的作業嗎?有幾個原因。
更新
現在您終於提到您正在使用 SignalR,我看到您正在嘗試在 ASP.NET 中託管 SignalR,對嗎?我認為您以錯誤的方式進行此操作,請參閱項目 wiki上引用的範例NuGet 包。此範例使用來管理任務。
IAsyncHttpHandler