WCF服务事件问题

时间:2011-04-01 19:04:20

标签: c# multithreading wcf events

我遇到了问题,我不知道如何将对象(通过WCF接收)转发到另一个线程(例如WinForm)。

我在 ComManager.cs

类中创建服务
        var wcfServer = new ServiceHost(typeof(ClientListenerService));
        wcfServer.Open();

我在 ClientListenerService.cs 中有这样的服务接口实现:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single ..... )]
public class ClientListenerService : IClient
{
    // This is a theoretical approach, as there is no way to forward an event handler to the service here
    public event xyz;

    public void AlarmTriggered(AlarmTriggeredDto dto)
    {
        // How do i get the object to some kind of event handler outside of this service here???
        // I need sth. like: 
        xyz.Invoke(dto);
    }
}

当调用方法 AlarmTriggered(dto)时,我需要将对象转发到另一个线程。 我不知道如何实现这一点,因为我无法找到一种方法将任何参数传递给我的ClientListenerService之后可以使用的servicehost(如eventhandler或sth。)。 静态对象/队列的所有变通方法都不符合我的要求。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

为了进一步解释John所说的内容,当您的WCF服务配置为Singleton([ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)])时,您可以创建并配置要事先用作单例的实例并将其传递到ServiceHost构造函数中

ClientListenerService svc = new ClientListenerService();
svc.xyz += myListener.xyzHandler;
var wcfServer = new ServiceHost(svc, baseAddresses);
wcfServer.Open();

我还建议downloading the ServiceModelEx library from iDesign,它提供ServiceHost<T>(由编程WCF服务的作者Juval Lowy编写)我发现使用它更容易

答案 1 :(得分:0)

您的ClientListenerService就像其他任何类一样。它可以像其他任何一样举办公共活动。主机中的其他代码可以像平常一样订阅该事件。