2011-04-01 70 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