【问题标题】:Raise custom event in a Windows Service from a shared library从共享库中引发 Windows 服务中的自定义事件
【发布时间】:2011-01-24 04:29:30
【问题描述】:

下面的代码表示具有 OnAppSettingsChanged 事件的共享库,其下方是订阅该事件并在引发时处理它的 Windows 窗体应用程序。自定义事件数据只不过是一个日期。我们将共享库称为 MyRegistryClass,它读取和写入注册表项并构建为单例实例,我们将使用相同的设计方法来调用类 MySettings 将保存读取和写入 MyRegistryClass 库的值以及 Windows 窗体使用的其他数据申请。

只要我从 MyRegistryClass 引发我的自定义事件并在 Windows 窗体应用程序中处理它,所有这些都可以正常工作。现在我想使用 Windows 服务中的部分或全部功能共享 MyRegistryClassMySettings 库每个。

我遇到的问题是,用于将事件处理程序添加到 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#


    【解决方案1】:

    这是因为它运行在另一个进程,另一个 appdomain 中。您需要某种 IPC 来完成这项工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多