using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Caching;
using System.Windows.Forms;
namespace MemoryCacheSample
{
public partial class Form1 : Form
{
private ObjectCache cache = MemoryCache.Default;
private string CacheKeyName = "filecontents";
private string FileFullName = @"d:\cache\example.txt";
public Form1()
{
InitializeComponent();
// 每一秒觸發一次
timer1.Interval = 1000;
timer1.Enabled = true;
timer1.Tick += Timer1_Tick;
}
private void CacheInit()
{
// 抓取檔案內容
string fileContents = File.ReadAllText(FileFullName);
CacheItemPolicy policy = new CacheItemPolicy();
// policy 設定 1:設定快取回收:設定 2 秒快取回收,預設為 10 秒
policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(2.0);
// policy 設定 2:監控資料來源是否已改變
List<string> filePaths = new List<string>() { FileFullName };
policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
// policy 設定 3:快取異動通知
policy.RemovedCallback = (arguments) =>
{
string CacheRemoveText = $"Cache:{arguments.CacheItem.Key} 回收,回收原因為 {arguments.RemovedReason}";
TextFill(CacheRemoveText);
};
// 使用 Set 設定快取:快取不存在時會新增,快取已存在時會直接覆寫
cache.Set(CacheKeyName, fileContents, policy);
}
private void Timer1_Tick(object sender, EventArgs e)
{
if (cache.Contains(CacheKeyName) == false)
CacheInit();
string CacheValue = cache.Get(CacheKeyName).ToString();
TextFill(CacheValue);
}
private void TextFill(string contents)
{
string Text = $"{DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss.fff")}-{contents}" + Environment.NewLine;
textBox1.Text += Text;
}
}
}
星期二, 9月 07, 2021
[C#] MemoryCache
官方文章 MemoryCache 類別 內的範例練習,修改為較容易觀察快取回收的情況
沒有留言:
張貼留言