我正在從Web服務中讀取第三方提要中的數據,稍微修改並存儲它,然後將其返回給我的客戶端。它只需要定期從第三方網站進行更新。它將作爲Azure中的Web角色中的WCF服務運行。如何在c#中構建Web服務緩存#
起初,我以爲我只是總讓我parsefeed方法的調用,但作出這樣的調用返回,如果最後一次更新是太快了...
public void ParseFeed()
{
if (DateTime.Now > lastrun.AddMinutes(1))
{
//Fetch updated data into something shared here.
//thedata is a public static in Global class
thedata = fetchdata();
lastrun=DateTime.Now;
}
}
但我想,作爲可以取需要1-2s(它是一種網絡服務),多個用戶會一次點擊該代碼。
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607從 因爲任何類的靜態成員,包括一個應用程序類,不是線程安全,用戶代碼必須提供用於訪問靜態成員適當的鎖定。這適用於您添加到應用程序類的任何靜態成員。
我可以使用鎖(不知道如何)編輯:大量的信息here
我能避免靜止無功,並使用高速緩存,並把我的數據在它(但會在過期時將被刪除,並且多個用戶會嘗試獲取數據)
我可以使用緩存中包含假數據(基本上是一個計時器)並在該數據過期時刷新 - 但即使沒有人正在擊中該網站。 (也可能不是線程安全的)
我無法真正使用輸出緩存,因爲客戶端以可能使每個請求唯一的方式查詢我返回的數據:我的服務根據請求排序和篩選
順便說一句我不擔心Azure上的多個實例的結果的一致性。每個人都可以自己獲取,所以我不需要在多臺服務器上共享狀態。
我覺得有一個簡單的解決方案,我完全錯過了。想法?
我發現了這個http://stackoverflow.com/questions/39112/what-is-the-best-way-to-lock-cache-in-asp-net#40065,它顯示瞭如何管理鎖。這可能適用於大多數選項,並且仍然存在是否使用緩存,靜態變量或者是否有更簡單的機制的問題 – Andiih 2010-11-26 09:53:24