2012-05-14 31 views
1

目前我有一個類監視傳入數據的串行端口,處理數據並根據接收到的數據通過代理/事件引發事件。這是一個獨立的應用程序。現在,我必須將其轉換爲服務,以便在Windows啓動時客戶端應用程序從遠程PC或本地計算機訂閱事件時,串行端口監視器類將作爲服務啓動。我見過很多關於使用WCF處理這類應用程序的文章。但是WCF是基於消息的,當客戶端被請求時它將創建一個服務對象。但我的要求是服務應該自動啓動,並且客戶端應用程序應該能夠訂閱在啓動期間已經創建的服務類實例的事件。我怎樣才能實現這個使用WCF?使用WCF服務進行事件處理

回答

1

在WCF的默認行爲是創建服務類來處理每一個請求的新實例,但你可以通過裝飾你的類重寫此:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 

要與辛格爾頓得到良好的性能,雖然,有你需要考慮幾件事情:

  • 因爲你可能需要做的Singleton實例的一些配置,你可能會想使用ServiceHost構造方法,它接受辛格爾頓實例作爲參數。 (例如,請參閱Figure 8 Initializing and Hosting a Singleton in this article
  • 線程處理:默認線程模型(ConcurrencyMode)一次只允許單個線程訪問您的Singleton實例,您可能需要查看使用ConcurrencyMode = ConcurrencyMode.Multiple以獲得良好性能(這意味着你需要自己處理與線程相關的問題)
  • 確保回調協議中的方法標記爲[OperationContract(IsOneWay = true)],以便將事件發回給訂閱者不會導致服務實例在事件處理程序完成之前阻塞(用這種方式使用WCF是covered in detail in this article by Juval Lowy
+0

謝謝你的回覆。我知道單身人士.AC實際上我看到的是我有一個課程可以做許多事情。基本上我不想只改變WCF的類。我發現思想鏈接很棒「http://msdn.microsoft.com/en-us/magazine/cc163537.aspx」。因爲發佈者和訂閱者是兩種不同的服務。 –