2012-10-25 120 views
4

背景: 我有一個運行在Windows Server 2008上的.NET 4.0 web服務,用C#編寫。 我想在每天運行一次代碼的asp.net web服務中運行一個計時器。我聽說過一些限制(見下文),但我問我是否計劃好以避免一些限制,並將代碼保留在Web服務中,因爲它不是關鍵任務代碼。然而,崩潰是不可接受的。注意:我不是,也不能使用WCF。如何使用System.Threading.Timer與asp.net web服務

計劃:

  • 聲明並在 我的web服務的構造函數實例System.Threading.Timer(旁邊的註釋行: //InitializeComponent();)。
  • 火災計時器每30分鐘。
  • 注意:因爲我使用的是System.Threading.Timer,所以我不應該按照下面的msdn提示#6運行 保持活動代碼。
  • 如果當前時間 在30分鐘內我的數據庫值(所需的時間運行代碼) 然後運行代碼。

問題:

  • 我想知道它是多麼可靠的使用上面,如果它會正常運行,讓我們說97%以上的計劃使用System.Threading.Timer在asp.net C#代碼的時間?
  • 此計劃在應用程序池被回收並且IIS服務器重新啓動時工作嗎?

似乎有使用Web服務中的計時器問題與問候到:

  • 應用程序池回收
  • 線程死亡
  • 沒有一個命中網頁長時間的時間
  • 內存問題(最好使用windows服務)

個參考文獻:

ASP.NET Site - Firing some code at a specific time

Timer on Website to activate Web Service calls every hour

http://forums.asp.net/t/1079158.aspx/1

http://msdn.microsoft.com/en-us/magazine/cc163854.aspx(參見祕訣6#)

從提示#6 「Timer類,在系統中找到.Threading命名空間,是一個非常有用,但不太知名的c至少對於Web開發人員來說,在.NET Framework中是不可能的。一旦創建,Timer將以可配置的間隔從ThreadPool調用線程上的指定回調。這意味着您可以設置代碼來執行,而無需向ASP發送傳入請求。NET應用程序,是後臺處理的理想情況。您可以在後臺進程中進行索引或發送電子郵件等工作。「

+3

我會先評論(根據標題)和_then_閱讀:請,請不要這樣做! –

+0

現在已經閱讀了,我可以請你參考一下我以前的(但不僅僅是)關於這個主題的答案 - 沒關係,但那是不同的,我說的相同:http://stackoverflow.com/a/5553048/263681最後,我想你誤解了你認爲你理解的數量,讓Timer保持活着。 –

回答

4

您正在使用錯誤的工具進行工作。 Web服務用於按需使用,而服務和計劃任務應用於定期活動。將相關代碼從Web服務中移出到共享庫中,然後創建一個帶有Timer的Windows服務或可通過計劃任務計劃的控制檯應用程序。

+0

好的感謝這個建議,我已經閱讀這裏和那裏,但還沒有考慮做反正......我已經開始了一個Windows服務項目,以妥善做到這一點。 – user610064

0

您可以在Application_Start事件中的Global.asax.cs文件中設置您的計時器對象,而不是在Web服務中。

1

如果由於某種原因,您必須這樣做。請務必閱讀約IRegisteredObject 以及Haacked的這篇文章subject