2012-08-13 53 views
4

我有一個.NET 4的Web應用程序,有3個獨立的項目相關聯 - DAL,BAL和UI。我正在使用實體框架進行數據庫交互。不斷運行的C#代碼 - 服務或單獨的線程?

我有一些代碼通過一串數據庫中的數據的週期,調用方法取決於其發現的,然後更新數據庫。我想要這個代碼一直運行。同時,我希望用戶能夠登錄並運行報告等,而後臺的代碼卻在不斷運行。

這是什麼方法?我是否爲不斷運行的代碼創建服務,單獨的線程,不斷運行的代碼的完全獨立的項目,還是不同的方法..?

此外,根據給出的答案,我將如何啓動不斷運行的代碼?即通過形式加載方法還是有更好的方法?我目前通過點擊開始按鈕啓動代碼;這對於測試是很好的,但在生產時不會起作用。

+0

與論壇網站不同,我們不使用「謝謝」,或「任何幫助表示讚賞」,或在[so]上簽名。請參閱「[應該'嗨','謝謝',標語和致敬從帖子中刪除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed - 從 - 個)。 – 2012-08-13 14:47:25

+0

如果線程的唯一目的是數據庫交互,並且DBMS是SQL Server,那麼您可能需要考慮將其實現爲[在SQL Server中託管的.NET程序集。](http://msdn.microsoft.com/zh-cn/ us/library/ms254498.aspx) – mbeckish 2012-08-13 14:49:07

+0

@mbeckish OP正在使用**實體框架** - 實體框架在.NET CLR中不受支持。參見[相關SO帖子](http://stackoverflow.com/a/2794127/175679)。它將不得不轉換成直接的ADO.NET。 – SliverNinja 2012-08-13 14:53:33

回答

5

對於總是運行的任務,您最適合使用Windows Services

在IIS下一個單獨的線程運行的代碼是不可靠的機制,因爲IIS可以隨意終止線程以節省服務器資源。

+2

您也可以將您的服務設置爲自動啓動。同時確保您的訪問代碼握手並確保在魔術發生之前啓動服務。 – crlanglois 2012-08-13 14:52:42

+0

創建Windows服務是否會影響Web託管選項。假設我想讓GoDaddy託管我的應用程序。我可以在他們的網絡服務器上安裝Windows服務嗎? – user1595656 2012-08-13 14:59:15

+0

如果您使用的是GoDaddy,則必須遠程託管服務 - 請參閱[相關的GoDaddy論壇帖子](http://support.godaddy.com/groups/web-hosting/forum/topic/scheduled-task-or-窗口服務/)。您應該考慮遷移到[** Windows Azure **](https://www.windowsazure.com/en-us/home/features/cloud-services/)。在Azure下設置Web角色+工作者角色+ SQL數據庫將爲您解決此問題。 – SliverNinja 2012-08-13 15:11:07

0

使用Windows服務。還應該考慮使用Stored Procs來處理您提到的數據庫交互。在關閉Windows服務的方面,您可以將其設置爲自動啓動(當操作系統啓動時),這意味着它將運行直至終止。

0

我只推薦一個Windows服務是否會從字面上始終運行。然而,「總是」通常意味着每x秒/分鐘/小時/天。

如果x大於幾分鐘,我將使它成爲控制檯應用程序並通過Windows任務計劃程序運行它。這樣你就不必擔心內存泄漏和其他一系列問題。

但是,如果它只與數據庫一起工作,我會推薦一個存儲過程和一個Sql Job。

2

鑑於其他答案你的問題,並澄清說:

  1. 您的解決方案在託管環境中,你不能安裝一個服務運行;
  2. 從第三個服務器(即Azure等)調用它不適合您;

在Application_Start事件中啓動一個線程來管理數據庫工作可能是最好的。您可能希望確保此線程有一些週期性的空閒時間,以免佔用過多的託管環境,並確保在應用程序結束或重新啓動時它已關閉。

服務真的是最佳的,但如果你是在託管環境,不能/不會使用另一臺服務器,那麼這是不可能的。

相關問題