2012-03-21 17 views
1

我的應用程序從緩存中讀取DLL數據。但如果任何開發人員更改DLL DllCaching必須更改。所以我一直在使用FileSystemWatcher來檢測DLL上的任何更改。如何使用FileSystemWatcher更改緩存數據?

我下面SYSTEN看守mechanizm:這個項目是在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 2012-03-21 12:22:35

+1

重新加載DLL的可能很難,看到這裏: http://stackoverflow.com/questions/1024072/how-to-reload-an-assembly-for-a-net-application-domain – pingoo 2012-03-21 12:31:21

+1

此外,在客戶端 - 服務器應用程序,它可能根本不可能。想象一下,你有一個DLL的方法,從附近的SQL服務器檢索數據。你怎麼可能會保證所有的客戶端一次只能使用該連接DLL的唯一版本?如果某些客戶端會以「olda方式」使用該服務器,並且其他客戶端將加載新的DLL,並且SQL服務器將遭受衝突的插入或刪除操作,那麼會發生什麼情況(並且認爲它們可以使用最新的DLL) ? – 2012-03-21 12:43:41

回答

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,它並不特別意味着單實例的用法,這隻意味着特定的客戶端訪問了你的Web窗體或至少會被授予(不是真的,實際上)一個線程。這也意味着IIS線程的數量可能會少於客戶端所需的數量。

附加地說,這也意味着您不能有效地使用單例模式,以及會話存儲或cookie(在web場異步調用的情況下會違反法律)。

唯一真正有效的選擇是實現一個Web服務,並積累對指定服務器路徑(不是物理路徑,而是IIS(或任何Web服務器,單聲道)路徑的更改,刪除或添加, etc \ bin \ dlls \,可以使用http utils BCL類爲網絡有效地轉換爲物理服務器路徑),並定期獲取所需信息。

如果您願意直接獲取這樣的信息是不可能的,因爲在監控實例之間,這個文件夾將處於非受控狀態f.e.將始終存在差距。在一個客戶端線程關閉之前,以及在下一個客戶端連接到服務器之前(例如,當用戶在頁面上上傳大文件時),然後調用F5或刷新頁面,但頁面已過期(過期狀態表示,客戶端頁面的有意義的狀態丟失,可能客戶端消費者線程在服務器上完成其工作,或者轉到隊列中的下一個客戶端。