我尝试使用有效的缓存,但我面临着一个问题。例如;我有5个用户他们使用我的应用程序。 user1,2,3,4只通过searcing填充网格(运行缓存!!!)。另一方面user5添加新行。我想在添加新行时刷新我的cach数据。我阅读多线程来做到这一点
code>using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Threading; using System.Collections; namespace WebApp.Caching.Threading { public partial class _Default : System.Web.UI.Page { protected void Page_Init(object sender, EventArgs e) { FillCache(); } void FillCache() { using (var myCtx = new DataClasses1DataContext()) { if (!(FlyAntCache.Exists("test"))) { List<Table_1> toolStoreList = myCtx.Table_1s.ToList(); FlyAntCache.Add(toolStoreList, "test"); } } } protected void Page_Load(object sender, EventArgs e) { WaitCallback method1 = new WaitCallback(ControlAllChanging); bool isQueued = ThreadPool.QueueUserWorkItem(method1, new ManualResetEvent(false)); } protected void ControlAllChanging(object state) { if (FlyAntCache.Exists("test")) { using (var myCtx = new DataClasses1DataContext()) { List<Table_1> list; list = myCtx.Table_1s.ToList(); List<Table_1> listCache = FlyAntCache.Get<List<Table_1>>("test"); bool IsIntersect = list.Except(listCache).Count() > 0; if (IsIntersect) { FlyAntCache.Clear("test"); FillCache(); } } } } protected void Button1_Click(object sender, EventArgs e) { // Search using (var myCtx = new DataClasses1DataContext()) { var Qry = myCtx.Table_1s. FromCache<Table_1>("test"). AsQueryable().Where(t => t.ad == TextBox1.Text.Trim()); GridView1.DataSource = Qry; GridView1.DataBind(); } } } }
请看:http://i53.tinypic.com/20pdc41.png
我真的控制着另一个用户是否更改了我的数据,我必须刷新我的缓存。是否有任何敏感性CAPTURE任何新的更改更新新行保存。例如 : 1)我必须捕获新的更新。这种机制必须在发生变化时运行 2)我必须捕获新的保存。当新行添加
时,此机制必须运行答案 0 :(得分:2)
我仍然不太确定你在问什么。我最好的猜测是,听起来你正试图让缓存知道它的数据何时过时。
大多数缓存实现都内置了它。基本上,您可以在更新缓存项时使其缓存(通常是从缓存中删除)。
例如,如果您只是使用ASP.net附带的普通旧内置缓存:
private static Cache Cache;
public void AddItem(string data)
{
//Do a database call to add the data
//This will force clients to requery the source when GetItems is called again.
Cache.Remove("test");
}
public List<string> GetItems()
{
//Attempt to get the data from cache
List<string> data = Cache.Get("test") as string;
//Check to see if we got it from cache
if (data == null)
{
//We didn't get it from cache, so load it from
// wherever it comes from.
data = "From database or something";
//Put it in cache for the next user
Cache["test"] = data;
}
return data;
}
UPDATE 我更新了代码示例以返回字符串列表而不仅仅是字符串。这应该使发生的事情变得更加明显。
重申一下,GetItems()调用检索字符串列表。如果该列表位于缓存中,则返回缓存列表。否则,将检索并缓存/返回列表。
AddItem方法显式地从缓存中删除列表,强制重新查询数据源。
答案 1 :(得分:0)
不确定但是你在寻找活动吗?您可以在缓存机制中设置事件,以便在发生更新时触发。