Asp.net

在 ASP.NET 中正確實現後台程序 Thread

  • June 1, 2012

我需要執行一個無限的 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

引用自:https://stackoverflow.com/questions/10852515