【发布时间】:2011-01-24 04:29:30
【问题描述】:
下面的代码表示具有 OnAppSettingsChanged 事件的共享库,其下方是订阅该事件并在引发时处理它的 Windows 窗体应用程序。自定义事件数据只不过是一个日期。我们将共享库称为 MyRegistryClass,它读取和写入注册表项并构建为单例实例,我们将使用相同的设计方法来调用类 MySettings 将保存读取和写入 MyRegistryClass 库的值以及 Windows 窗体使用的其他数据申请。
只要我从 MyRegistryClass 引发我的自定义事件并在 Windows 窗体应用程序中处理它,所有这些都可以正常工作。现在我想使用 Windows 服务中的部分或全部功能共享 MyRegistryClass 和 MySettings 库每个。
我遇到的问题是,用于将事件处理程序添加到 Windows 服务的相同设计方法不会导致服务收到已引发事件的通知,即使 Windows 窗体应用程序确实收到了通知。
我没有找到造成这种差异的原因或解决方法(如果存在的话)。是因为 Windows 服务运行后台进程还是因为它没有消息循环?我很难过,可以使用一些指导。
namespace CommonLibrary
{
public delegate void AppSettingsEventHandler(object sender,
DateChangeEventArgs e);
public sealed class MyRegistryClass
{
public event AppSettingsEventHandler OnAppSettingsChanged;
private static MyRegistryClass instance;
private static object synchRoot = new Object();
public static MyRegistryClass Instance
{
get
{
if (instance == null)
{
lock (synchRoot)
{
if (instance == null)
instance = new MyRegistryClass();
}
}
return instance;
}
}
private MyRegistryClass()
{
// do some work to initialize single instance class
}
private void RaiseAppSettingsEvent(DateTime newDate)
{
OnAppSettingsChanged(this, new DateChangeEventArgs(newDate));
}
public void SaveAppSettings(MySettings fileSettings)
{
// Save some Registry settings then raise the event
RaiseAppSettingsEvent(newDateTime);
}
}
public class DateChangeEventArgs : EventArgs
{
public DateTime NewDate { get; private set; }
public DateChangeEventArgs(DateTime newDate)
{
this.NewDate = newDate;
}
}
}
namespace MyApplication
{
public partial class FileCopyTrayApp : Form
{
private MyRegistryClass myRegistryLib;
private MySettings mySettingsLib;
public FileCopyTrayApp()
{
this.myRegistryLib = MyRegistryClass.Instance;
this. mySettingsLib = MySettings.Instance;
this.myRegistryLib.OnAppSettingsChanged += new
AppSettingsEventHandler(myRegistryLib_OnAppSettingsChanged);
}
private void myRegistryLib_OnAppSettingsChanged(object sender,
DateChangeEventArgs e)
{
this.mySettingsLib.NextRunDateTime = e.NewDate;
}
}
}
【问题讨论】:
标签: c#