2011-04-01 67 views
0

我有问题,我不知道如何为一个对象(通过WCF收到)转发到另一个线程(例如一个WinForm)。WCF的服务事件的问题

我在类中创建服务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)被调用,我需要将该对象转发到另一个线程。 我不知道如何实现这一点,因为我不能找到一种方法,任何参数传递给ServiceHost的(如一个事件处理程序或某事),我ClientListenerService以后可以使用。 静态对象/队列的所有解决方法都不符合我的要求。

任何想法?

回答

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服务的作者写的),我发现它更容易的工作。

+0

非常感谢!我正在尝试这个单例实例的东西,但我不知道它必须像这样构造! – David 2011-04-01 21:58:07

+0

它没有*可以这样构建,但它允许你,因为单例是一种特殊情况。默认情况下,WCF将在您的类上使用默认构造函数。 – 2011-04-01 22:16:43

+0

到ServicemodelEx下载链接的链接似乎已损坏。它在http://idesign.net/Downloads/GetDownload/1887 – B4ndt 2013-01-08 10:51:02

0

你ClientListenerService是一类,就像任何其他。它可以像任何其他公共事件一样。就像平常一样,主机中的其他代码可以订阅该事件。

+0

没有,类由“的ServiceHost”类instantiiated,我也没有办法得到任何thorugh这个实例... – David 2011-04-01 19:20:01

+1

使用['ServiceHost的constructor'(http://msdn.microsoft.com/en- us/library/ms585487.aspx) – 2011-04-01 19:26:40