14

我正在尝试使 System.Runtime.Caching 命名空间中包含的新 SqlChangeMonitor 功能正常工作,并且得到了一些意想不到的结果。

我有一个简单的控制台应用程序设置:

static void Main(string[] args)
{
    var cacher = new Cacher();

    cacher.Start();

    Console.WriteLine("Watching for changes...");

    while (true)
    {
        if (cacher.HasData)
        {
            Console.Write(".");
            Thread.Sleep(1000);
        }
        else
        {
            Console.WriteLine();
            Console.WriteLine("Cache EMPTY!");
            Console.ReadLine();
            cacher.Start();
        }
    }
}

Cacher 类定义为:

public class Cacher
{
    private MemoryCache cache = new MemoryCache("test");

    public Boolean HasData
    {
        get { return cache.Contains("data"); }
    }

    public void Start()
    {
        var connectionString = "Data Source=.;Initial Catalog=CachingTest;Integrated Security=True";
        var list = new NameValueCollection();
        var policy = new CacheItemPolicy();

        SqlDependency.Start(connectionString);

        using (var connection = new SqlConnection(connectionString))
        {
            using (var command = new SqlCommand("SELECT * FROM dbo.Table_1", connection))
            {
                var dependency = new SqlDependency(command);

                connection.Open();

                var reader = command.ExecuteReader();

                while (reader.Read())
                {
                    list.Add(reader["Name"].ToString(), reader["Value"].ToString());
                }

                var monitor = new SqlChangeMonitor(dependency);

                policy.ChangeMonitors.Add(monitor);
            }

            cache.Add("data", list, policy);
        }
    }
}

当我运行代码时,我收到 Waiting 消息和一个单点“。”,延迟一秒,然后是“Cache Empty”消息。在我按下一个键重新启动循环后重复此操作。

我错过了什么?

4

1 回答 1

14

事实证明,我最初的问题是由于在 SELECT 语句中使用星号 (*) 通配符引起的。我一列出列名,缓存就开始正常工作。

我还想在更新/清除缓存时接收代码通知。ChangeMonitor 的 NotifyOnChanged 方法不起作用,因为它是供内部使用的。

事实证明,CacheItemPolicy 对象有两个回调:RemovedCallback 和 UpdateCallback,可用于这些目的。只需将这些属性设置为代码中的方法并采取所需的操作。

鉴于 SqlChangeMonitor 上缺乏可用的文档,我希望这可能对遇到这些问题的其他人有所帮助。

于 2011-10-24T22:23:43.310 回答