2011-09-21 52 views
0

我想通過一個WCF數據服務(Singlton)公開一些端點,它將維護用於響應各個請求的數據集合。WCF數據服務+到期數據(定時器?)

理想情況下,我希望能夠在一段時間後過期(刪除)給定請求的內存中保存的數據。

存儲的數據將用於構建(部分只是,因此開箱即用的緩存不正常)結果集返回給客戶端。數據將來自API的對象,並且必須保存在內存中,而不是存儲到存儲器中。

我正在尋找方法來觸發'清除'過程來檢查過期的數據。在ctor中啓動一個定時器似乎是一個糟糕的主意。它可以針對每個請求運行(啓用單個併發),但這看起來過多,並且可能會在沒有更多請求時將數據留在那裏?

對這個問題的任何想法都表示讚賞。

回答

0

用系統計時器結束重新設計和託管Windows服務中的相關服務組件以清除所需的數據。

0

您需要某種計時器來定期運行清理過程。您可以根據請求觸發,但這並不可取,因爲您當然不應阻止對可能是長時間運行的清理過程的請求,並且因爲您可能在請求之間有很長一段時間,這意味着請求可能會處理超出其壽命的數據。

一種選擇是不通過使讀取過濾器數據超出其使用期限而使清除過程不重要。例如,您可以使用內存數據庫,如SQL Compact Edition或Sqlite。高速緩存的數據可能有一個時間戳列,然後讀入高速緩存可能會查詢,並始終按照不比X早的時間戳進行過濾。這樣做會使不是關鍵以進行清理,而是優化內存真的應該發生的壓力。 Sql只是給你簡單的機制,按時間戳過濾。你可以在你自己的內存數據結構中做同樣的事情。

就清理過程而言,您需要某種計時器或某些東西來踢它運行。在proc服務中啓動WCF的過程也可以啓動一個定時器,並定期調用緩存來清理它。如果在清理時調用清理函數,它就會返回。如果你使得清理不是嚴格的(如上所述),並且如果運行清理過程被忽略,那麼每個請求都可能會被踢掉。

+0

嘿,感謝您的快速回復。我聽到你在說什麼,但不幸的是,我將要存儲的對象不包含靜態數據,因此將它們保存到數據庫中(除非我對SQLCE/Lite的理解是離開的)不是一種選擇,但存儲對象的方式是沒有任何問題。自定義容器類+ LINQ = :)。我的問題是過程的觸發。正如你指出的那樣,計時器將起作用。我瞭解到Timer會在不同的線程上啓動它的處理程序,從而導致單個服務可能會出現爭用狀況,從而查看它的持續數據收集... – Kyle