星期二, 9月 07, 2021

[C#] MemoryCache

官方文章 MemoryCache 類別 內的範例練習,修改為較容易觀察快取回收的情況
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;
        }
    }
}
[C#] MemoryCache

沒有留言:

張貼留言