C# 静态数据成员未在同一解决方案C下的2个项目中共享#
我在同一个c#解决方案中有两个项目。一个项目是普通wpf应用程序,另一个是windows服务。当wpf应用程序更新数据库中的某些变量时,windows服务需要相应地更新。 在我的wpf应用程序中,我有一个save方法来更新静态字段,如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
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;
}
}