2014-09-11 4 views
-1

동일한 C# 솔루션으로 2 개의 프로젝트가 있습니다. 하나의 프로젝트는 일반적인 wpf 응용 프로그램이고 다른 프로젝트는 windows 서비스입니다. wpf 응용 프로그램이 데이터베이스의 일부 변수를 업데이트하면 Windows 서비스가 그에 따라 업데이트해야합니다. 내 WPF 응용 프로그램에서 , 내가 Windows 서비스 프로젝트에서정적 데이터 멤버가 동일한 솔루션에서 2 개의 프로젝트에 공유되지 않음 C#

private void ConfigurationPanelSave_Click(object sender, RoutedEventArgs e) 
{ 
     bool isSuccess = SaveData(); 
     if (isSuccess) 
     { 
      DatabaseInteractivity.HasChanges = true; //static member to indicate data has been changed 
     } 
    } 

같은 정적 필드를 업데이트하는 저장 방법을 가지고, 내가 DatabaseInteractivity 객체 30 초 간격 이후에 호출되는 타이머 이벤트가 (데이터가 있는지 확인합니다 이 변경된 경우, 변경된 사실을 DatabaseInteractivity 클래스의 일부 구성)

private void timer_elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    if (DatabaseInteractivity.HasChanges) 
    { 
     ConfigurationReader.ReadConfiguration(); 
     DatabaseInteractivity.HasChanges = false; 
    } 
} 

난 WPF 애플리케이션을 통해 데이터를 저장할 때 문제가있다, 그것이 고정 부재 (HasChanges을 갱신)를 다시 판독 timer_elapsed 때 이벤트는 윈도우 서비스 프로젝트에서 HasChanges는 항상 거짓입니다. 타이머 이벤트가 처음으로 호출되면 안됩니까? 많은 기사와 다른 접근법을 읽었지 만 왜 그런 일이 일어나지 않는지 알고 싶습니다.

+1

두 개의 개별 실행 파일입니다. 그런 정적 속성을 사용할 수 없습니다. 정적 속성은 동일한 프로세스 내에서만 공유됩니다. – pquest

+0

다른 프로젝트에서 하나의 프로젝트를 참조 했더라도? http://stackoverflow.com/questions/8209345/share-variables-between-projects –

+3

@pquest 엄밀히 말하면 각 'AppDomain'에는 정적 필드의 자체 복사본이 있습니다. 따라서 * 정적 속성은 동일한 'AppDomain' 프로세스 내에서만 공유됩니다. * –

답변

-1

정적 객체는 실행중인 스레드에 대해 정적입니다.
나는 wpf 응용 프로그램 스레드와 Windows 서비스 스레드를 실행하고 있다고 생각합니다.
dll (일명 소스)이 같더라도 다른 스레드에서 실행 중이며 서로 다른 변수에 액세스 할 수 없습니다.

1

정적 멤버가 작동하는 방식이 아닙니다. WPF 응용 프로그램과 서비스는 두 개의 별도 프로세스로 실행됩니다. 서로 다른 응용 프로그램 도메인에 존재하므로 각 프로세스에는 자체 구성원 인 정적 구성원 DatabaseInteractivity.HasChanges이 있습니다. 그들은 서로 전혀 관련이 없습니다. 그들은 메모리의 다른 위치에 존재합니다. 하나를 변경하면 다른 하나에는 영향을 미치지 않습니다.

프로세스 간 통신을 조사해야합니다. 예를 들어, Windows 서비스는 WPF 응용 프로그램이 연결할 수있는 WCF 또는 Thrift 서비스 끝점을 제공 할 수 있습니다. 종점에는 응용 프로그램에서 데이터가 저장되었음을 서비스에 알리기 위해 호출하는 메서드가 있습니다.