Пользовательская зависимость кэша asp.net, обновите все в один момент - PullRequest
1 голос
/ 04 февраля 2012

У меня есть пользовательская зависимость кэша

class MyCacheDependency : CacheDependency
{
    private const int PoolInterval = 5000;
    private readonly Timer _timer;
    private readonly string _readedContent;

    public MyCacheDependency()
    {
        _timer = new Timer(CheckDependencyCallback, this, PoolInterval, PoolInterval);
        _readedContent = ReadContentFromFile();
    }

    private void CheckDependencyCallback(object sender)
    {
        lock (_timer)
        {
            if (_readedContent != ReadContentFromFile())
            {
                NotifyDependencyChanged(sender, EventArgs.Empty);
            }
        }
    }

    private static string ReadContentFromFile()
    {
        return File.ReadAllText(@"C:\file.txt");
    }

    protected override void DependencyDispose()
    {
        if (_timer != null) _timer.Dispose();

        base.DependencyDispose();
    }
}

Это работает отлично, но мне интересно, как сделать обновление всего объекта за один раз. Здесь я помещаю в кеш 2 объекта

Cache.Insert ("c1", "var1", new MyCacheDependency ());

Cache.Insert ("c2", "vae2", new MyCacheDependency ());

Это хорошо, но когда c1 обнаружит изменение, как заставить c2 не ждать 5 секунд, чтобы проверить, но я хочу называть себя DependencyDispose, когда c1 делает это.

Другими словами, если c1 обнаруживает изменение, c2 также должен вызвать DependencyDispose

1 Ответ

1 голос
/ 04 февраля 2012

Возможно, вы могли бы добавить статическое событие, которое будет вызываться в вашем методе CheckDependencyCallback (). В вашем конструкторе для MyCacheDependency вы бы затем добавили обработчик событий. Когда событие вызывается, вы можете вызвать NotifyDependencyChanged или DependencyDispose оттуда. Таким образом, все объекты MyCacheDependency будут реагировать на изменение.

class MyCacheDependency : CacheDependency
{
    private const int PoolInterval = 5000;
    private readonly Timer _timer;
    private readonly string _readedContent;

    public static event EventHandler MyEvent;

    public MyCacheDependency()
    {
        _timer = new Timer(CheckDependencyCallback, this, PoolInterval, PoolInterval);
        _readedContent = ReadContentFromFile();
        MyEvent += new EventHandler(MyEventHandler);
    }

   protected void MyEventHandler(object sender, EventArgs e) {
    NotifyDependencyChanged(sender, e);
   }

    private void CheckDependencyCallback(object sender)
    {
        lock (_timer)
        {
            if (_readedContent != ReadContentFromFile())
            {
                if(MyEvent!=null)
                    MyEvent(sender, EventArgs.Empty);
            }
        }
    }

    private static string ReadContentFromFile()
    {
        return File.ReadAllText(@"C:\file.txt");
    }

    protected override void DependencyDispose()
    {
        if (_timer != null) _timer.Dispose();

        base.DependencyDispose();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...