2012-03-21 6 views
1

мое приложение считывает данные DLL из кеша. но если какой-либо разработчик изменяет DLL, DllCaching должен измениться. Поэтому я использовал FileSystemWatcher для обнаружения любых изменений в библиотеках DLL.Как использовать FileSystemWatcher для изменения данных кеша?

Мой Systen Watcher Механизм ниже: этот проект находится в asp.net


    public void CreateFileWatcher(string path) 
     { 
      FileSystemWatcher watcher = new FileSystemWatcher(); 
      watcher.Path = path; 

      watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
      watcher.IncludeSubdirectories = true; 
      watcher.Filter = "*.dll"; 

      // Add event handlers. 
      watcher.Changed += new FileSystemEventHandler(OnChanged); 
      watcher.Created += new FileSystemEventHandler(OnChanged); 
      watcher.Deleted += new FileSystemEventHandler(OnChanged); 
      watcher.Renamed += new RenamedEventHandler(OnChanged); 

      // Begin watching. 
      watcher.EnableRaisingEvents = true; 
     } 

    private static void OnChanged(object source, FileSystemEventArgs e) 
     { 

      //FillCache 
} 

Button1_Click 
{ 
CreateFileWatcher(@"C:/data") 

// like that: 
    myarray = CachData 
} 

Как это сделать? как загрузить dll (снова загружается) при изменении Dll.

+0

Как вы загружаете эти DLL в первый круг? – Oliver

+1

Перезагрузка DLL может быть сложной, см. Здесь: http://stackoverflow.com/questions/1024072/how-to-reload-an-assembly-for-a-net-application-domain – pingoo

+1

Кроме того, серверных приложений, это может быть просто невозможно. Представьте себе, что у вас есть dll с методами, которые извлекают данные из SQL-сервера поблизости. Как вы, вероятно, гарантируете, что все клиенты одновременно будут работать с единственной версией DLL этого соединения? Что произойдет, если некоторые из клиентов будут работать (и подумают, что они работают с самой последней DLL, возможны) с тем, что разорвать «по-старому», в то время как другие загружают новую DLL, а SQL-сервер будет страдать от вложений или удалений ? –

ответ

1

Это препятствие на пути очистки кеша, если вы используют кеш в вашем приложении, и при внедрении пользовательской логики для очистки кеша становится сложнее. Если вы используете кэш EnterpriseLibrary, мы можем иметь зависимость при добавлении элементов в кеш. Любое изменение этого файла очистит кеш.

Ниже приведен пример кода. Такая же перегрузка доступна для кэша asp.net.

FileDependency cacheFileDependency = new FileDependency("\\mynetworkpath\abc.txt"); 
cacheMgr.Add(cacheName, cacheValueList, 
      Microsoft.Practices.EnterpriseLibrary.Caching.CacheItemPriority.Normal, 
      null, cacheFileDependency); 
-1

Вы не понимаете, как работает ASP.NET, я полагаю. Вот мое видение, надеюсь, что это поможет вам понять проблему и найти подходящее решение.

Я использую FileSystemWatcher в элементах управления на стороне сервера, что особенно не означает использование одного экземпляра, что означает, что этот конкретный клиент обратился к вашей веб-форме или к тому, что будет предоставлено (на самом деле, на самом деле) один поток. Это также означает, что поток IIS может быть меньше, чем требуется клиенту.

Дополнит. Это означает, что вы не можете эффективно использовать шаблон Singleton, а также хранилище сеансов или файлы cookie (это нарушит закон в случае асинхронных вызовов веб-фермы).

Единственный действительно рабочий вариант - реализовать веб-сервис и накапливать изменения, удаления или добавления к указанному пути к серверу (не физический путь, а скорее путь IIS (или любого веб-сервера, fe моно), т. Е. и т. д. \ bin \ dlls \, которые могут быть эффективно переведены на физический путь к серверу с использованием http utils BCL-классов для Интернета) и периодически получать требуемую информацию.

Если вы хотите получить такую ​​информацию напрямую, что будет невозможно, потому что всегда будут промежутки между экземплярами мониторинга, где эта папка будет находиться в неконтролируемом состоянии, т. Е. между одним потоком клиента отключается и непосредственно перед тем, как следующий клиент подключится к серверу, например, когда пользователь загружает большой файл на страницу, а затем вызывает F5 или обновляет страницу, но страница перешла в состояние с истекшим сроком действия (истекшее состояние означает , что значимое состояние страницы для клиента потеряно, возможно, клиентский поток потребителя на сервере завершил свою работу или отправился к следующему клиенту в очереди.

Смежные вопросы