Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态数据成员未在同一解决方案C下的2个项目中共享#_C#_Wpf_Static Members_Access Modifiers - Fatal编程技术网

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

C# 静态数据成员未在同一解决方案C下的2个项目中共享#,c#,wpf,static-members,access-modifiers,C#,Wpf,Static Members,Access Modifiers,我在同一个c#解决方案中有两个项目。一个项目是普通wpf应用程序,另一个是windows服务。当wpf应用程序更新数据库中的某些变量时,windows服务需要相应地更新。 在我的wpf应用程序中,我有一个save方法来更新静态字段,如 private void ConfigurationPanelSave_Click(object sender, RoutedEventArgs e) { bool isSuccess = SaveData(); if (isSucce

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

 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秒间隔后被调用(以查看数据是否已更改,如果更改,它将重新读取一些配置)

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

静态对象在您运行的线程中是静态的。
我猜您正在运行wpf应用程序线程和windows服务线程。

即使dll(也称为源)是相同的,它们仍然从不同的线程运行,并且它们不能访问彼此的变量。

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


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

它们是两个独立的可执行文件。不能使用这样的静态属性。静态属性仅在同一进程中共享。即使我引用了一个项目,也不共享@pquest严格来说,每个
AppDomain
都有自己的静态字段副本。因此,静态属性仅在相同的
AppDomain
中共享,而不是共享process@SriramSakthivel啊,你说得对
 private void timer_elapsed(object sender, System.Timers.ElapsedEventArgs e)
 {
     if (DatabaseInteractivity.HasChanges)
     {
         ConfigurationReader.ReadConfiguration();
         DatabaseInteractivity.HasChanges = false;
     }
 }