2012-06-27 37 views
3

我想做一個簡單的Windows服務,維護一個整數隊列並通過WCF調用接受來自其他應用程序的新整數。我目前的實現似乎爲每個與它通信的應用程序保持單獨的隊列,這不是我想要的。WCF服務託管Windows服務在調用之間不保存狀態

我從微軟的指示開始,在How to: Host a WCF Service in a Managed Windows Service上。

我WindowsService類看起來是這樣的:

public class MyWindowsService : ServiceBase{ 
    public ServiceHost serviceHost = null; 

    public MyWindowsService(){ 
     ServiceName = "AdHocReportService"; 
    } 
    public static void Main(){ 
     ServiceBase.Run(new MyWindowsService()); 
    } 

    protected override void OnStart(string[] args){ 
     if (serviceHost != null) 
      serviceHost.Close(); 

     serviceHost = new ServiceHost(typeof(MyService)); 
     serviceHost.Open(); 
    } 
    protected override void OnStop(){ 
     if (serviceHost != null){ 
      serviceHost.Close(); 
      serviceHost = null; 
     } 
    } 
} 

在我的服務類我有一個隊列和一個Add方法。 add方法在添加之後返回隊列中的項目數。代碼如下所示:

public class MyService : IMyService 
{ 
    private Queue<int> myQueue= new Queue<int>(); 

    public int Add(int reportId) 
    { 
     myQueue.Enqueue(reportId); 
     return myQueue.Count; 
    } 
} 

最後,我在ConsoleApp用下面的代碼測試我的服務:

MyServiceClient client = new MyServiceClient(); 
int count = client.Add(10); 
Console.WriteLine(count); //prints 1 
count = client.Add(25); 
Console.WriteLine(count); //prints 2 
Console.ReadLine(); 

我希望它可以打印1和2的第一次我的測試運行,然後第二次3和4,然後5和6第三次,依此類推。但是,它每次只返回1和2,就好像控制檯應用程序正在實例化對象本身並且不在Windows服務中的對象上操作一樣。我不瞭解什麼?

回答

5

我想你想要一個singleton WCF服務。見here

默認情況下,WCF服務的實例模式爲per-call。因此,您的每個電話都會由主持人創建您的服務實例。

注意:使用單件服務時,您的操作需要爲線程安全。所以我建議從Queue切換到ConcurrentQueue,這樣你就可以處理多個併發客戶端。

替代:使用MSMQ binding。這將確保您的所有傳入消息排隊在進程外,因此在重新啓動之間也保持不變。