2012-03-21 3 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을로드 할 때 (다시로드) Dlls 변경됩니다.

+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은 새 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 스레드가 클라이언트에서 필요로하는 것보다 적은 수로있을 수 있습니다.

Addilitionally, 또한 세션 저장 또는 쿠키 (웹 팜 비동기 호출의 경우에는 법을 위반 함)뿐만 아니라 효과적으로 싱글 톤 패턴을 사용할 수 없다는 것을 의미합니다.

유일한 실제 옵션은 웹 서비스를 구현하고 지정된 경로 (물리적 경로가 아니라 IIS (또는 웹 서버) 경로)에 변경, 삭제 또는 추가를 누적하는 것입니다. 예를 들어 \ etc \ bin \ dlls \, 웹용 http 유틸리티 BCL 클래스를 사용하여 실제 서버 경로로 효과적으로 변환 할 수 있음), 정기적으로 필요한 정보를 얻을 수 있습니다.

이러한 정보를 직접 얻을 의향이있는 경우 모니터링 할 인스턴스 사이에 항상 간격이 있기 때문에이 폴더는 제어되지 않은 상태가됩니다. 예를 들어 사용자가 페이지에 큰 파일을 업로드 한 다음 F5를 호출하거나 페이지를 새로 고치지 만 만료 된 상태로 된 페이지 (만료 된 상태를 의미 함)가있을 때와 같이 다음 클라이언트가 서버에 연결하기 직전에 하나의 클라이언트 스레드가 종료됩니다 클라이언트에 대한 페이지의 의미있는 상태가 손실 될 수 있습니다. 서버의 클라이언트 소비자 스레드가 작업을 마쳤거나 대기열의 다음 클라이언트로 이동했을 수 있습니다.

관련 문제