0

我有一个班级引发一些事件并进行操作。例如

class MyService
{
    EventHandler MessageSent;
    EventHandler StatusReceived;

    public void StartService(Serviceconfig configObject)
    {
         //Intialize serial port with OnSerialPortReceived event handler.

    }

    public void GetStatusForMessage(string messageID)
    {
    }

    public void OnSerialPortReceived(string data)
    {
        if(data=="123")
              MessageSent(this,null);
        if(data=="456")
              StatusSent(this,null);
    }
}

这是一个控制台应用程序,它将在系统启动时启动。现在,当事件服务上触发某些事件时,我们需要一个监控应用程序(基本上是一个带有回调的客户端),为此我们应该使用 WCF。并且监视器应用程序调用服务类。在上面的例子中,GetStatusForMessage 方法将被监视器应用程序调用。那么现在我们如何使用 WCF 来实现。如果使用服务契约将上述类作为服务,则在客户端发起调用之前,它不会被初始化和启动。当系统重新启动时,此类对象将被初始化并启动其功能。

我发现这篇文章http://msdn.microsoft.com/en-us/magazine/cc163537.aspx。通过这种方法,我的服务将成为发布者客户端,监控应用程序将成为订阅者客户端应用程序。但是客户端必须调用服务类。所以我的客户端应用程序应该支持回调并且它应该能够调用服务方法。如何使用 WCF 实现这一目标?请注意,监视事件的服务类是单个实例,并在应用程序启动时初始化。

希望我能得到解决方案。请让我知道更多说明。

4

2 回答 2

0
  1. 使您的“服务”成为 Widnows 服务而不是控制台应用程序。
  2. 您可以毫无问题地将 MyService 类设置为 WCF 服务。但是您也可以创建一些其他类来托管您的服务合同并简单地与您的 Windows 服务实现进行通信。
  3. Windows 服务激活时间和第一个 WCF 请求之间没有联系(这不是 IIS,这是一个自托管的 WCF 服务,您可以在需要时启动它)。
  4. 这是自托管 WCF 服务教程的链接
  5. 使用自动运行选项在您的机器上安装 Windows 服务。
于 2012-05-18T08:36:37.890 回答
0

不要试图使您的服务成为 WCF 服务。使它成为一个单例并让 WCF 与它交谈。

如果您希望事件向监视应用程序触发“事件”,您将需要使用双工绑定(如果跨机器,NetTcpBinding 或同一台机器上的 NetNamedPipeBinding 是我的建议)。当监控应用程序连接时,保存其回调通道并在连接到回调通道上的事件回调的方法中。

请注意,您必须在双方都保持会话处于活动状态,因此监控应用程序和服务必须比配置的 receiveTimeout(默认为 10 分钟)更频繁地相互触发某些东西,但这可能只是一种“ping”方法来使用作为保命

如果有帮助,我不久前写过关于双工通信的博客

于 2012-05-16T10:37:23.343 回答