Как заставить SqlChangeMonitor работать - PullRequest
14 голосов
/ 24 октября 2011

Я пытаюсь заставить работать новую функцию SqlChangeMonitor, включенную в пространство имен System.Runtime.Caching, и получаю некоторые неожиданные результаты.

У меня есть простая настройка консольного приложения:

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"сообщение.Это повторяется после того, как я нажимаю клавишу, чтобы перезапустить цикл.

Чего мне не хватает?

1 Ответ

14 голосов
/ 25 октября 2011

Оказывается, моя первоначальная проблема была вызвана использованием подстановочного знака звездочки (*) в операторе SELECT.Как только я перечислил имена столбцов, кеш начал работать правильно.

Я также хотел получать уведомления в коде, когда кеш обновлен / очищен.Метод NotifyOnChanged в ChangeMonitor не работает, поскольку он предназначен для внутреннего использования.

Как выяснилось, объект CacheItemPolicy имеет два обратных вызова: RemovedCallback и UpdateCallback, которые могут использоваться для этих целей.Просто установите эти свойства для методов в коде и выполните желаемое действие.

Учитывая отсутствие документации, доступной на SqlChangeMonitor, я надеюсь, что это может помочь всем, кто сталкивается с этими проблемами.

...