在同一解决方案C#下的两个项目中未共享静态数据成员

本文关键字:项目 两个 数据成员 静态 共享 解决方案 | 更新日期: 2023-09-27 18:21:35

我在同一个c#解决方案中有两个项目。一个项目是普通的wpf应用程序,另一个是windows服务。当wpf应用程序更新数据库中的一些变量时,windows服务需要相应地更新。在我的wpf应用程序中,我有一个保存方法,它更新像这样的静态字段

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

在windows服务项目中,我有DatabaseInteractivity对象和一个计时器事件,它在30秒间隔后被调用(查看数据是否已更改,如果更改,它会重新读取一些配置)

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

问题是,当我通过wpf应用程序保存数据时,它会将DatabaseInteractivity类的静态成员(HasChanges)更新为true,而当调用timer_perated事件时,windows服务项目中的HasChanges总是false。当计时器事件被调用时,这不是第一次是真的吗?我读过很多文章和不同的方法,但我很想知道为什么它没有发生。

在同一解决方案C#下的两个项目中未共享静态数据成员

不,静态成员不是这样工作的。您的WPF应用程序和服务将在两个独立的进程中运行。由于它们存在于不同的应用程序域中,每个进程都有自己版本的静态成员DatabaseInteractivity.HasChanges。它们彼此完全无关;它们存在于记忆中的不同位置。改变其中一个对另一个没有影响。

您需要研究进程间的通信。例如,您的Windows服务可以提供WCF或Thrift服务端点,您的WPF应用程序可以连接到该端点。端点将有一个方法,应用程序将调用该方法来通知您的服务数据已保存。

静态对象在运行的线程中是静态的。
我猜您正在运行一个wpf应用程序线程和一个windows服务线程
即使dll(又名源)是相同的,它们仍然从不同的线程运行,并且不能访问其他变量。