2012-09-06 122 views
1

我正在開發一個應用程序(學校項目),它是一個服務+外部WPF UI。 我已經計劃使用WCF進行用戶界面到服務的通信。 無論如何,如果發生一些事件,服務需要通知UI,我正在尋找一種簡單的方法來實現它。將服務發送到WPF應用程序的好方法

當然,任何基本的IPC都可以工作,但我不想搞亂管道,互斥,事件等等。

在本機win32應用程序中,我會使用WM_USER消息,但據我瞭解,它本身不受WPF支持。

有人能指出一些可能的/最好的解決方案嗎?

感謝

+0

WCF支持雙工通信。 –

+2

互斥和事件不是真正的IPC。它們是不傳遞數據的跨進程同步基元。推薦的做法是使用命名管道。 WCF將包裝一個管道,以便您可以使用WCF通過管道進行通信;或者你可以使用.NET管道API。另一種方法是使用套接字 - WCF也將包裝。 –

+0

我絕對需要深入研究WCF。無論如何,如果我想做一個雙工WCF通信可以服務工作,而用戶界面不運行(另一個WCF端無法訪問?) – ArtoAle

回答

2

一種方法我用的是充當一個共享的數據庫表隊列。您的用戶界面應用會跟蹤它所看到的最後一條記錄(索引或時間戳)並定期輪詢新事件。將您的查詢和更新與事務綁定,以防止出現併發問題。數據庫的一個優點是它保留了有助於調試和崩潰的事件。 System.Data.Sqlite,RavenDBSql Server Compact Edition是不錯的選擇。

另一種選擇是使用ZeroMQ作爲通過TCP/IP的發佈/訂閱消息系統。 ZeroMQ非常易於安裝,並且可以處理高消息量。

數據庫和ZeroMQ方法都可讓您將UI應用程序置於遠程計算機上,而不需要將其置於服務主機上。

我還建議您將事件定義爲類並將其序列化爲字符串,而不管您是使用數據庫還是使用ZeroMQ來傳遞事件。我建議ServiceStack的優秀,易於使用的JSON串行器。

+0

其實我已經有一個Sql Server CE。問題在於「輪詢」解決方案不是我正在尋找的,否則我可以使用WCF定期詢問要通知的事情。我也使用過RabbitMQ作爲NodeJS/Reverse Ajax項目,但它需要額外的軟件運行。 – ArtoAle

+1

ZeroMQ不需要單獨的消息代理應用程序 - 您將一個程序集添加到服務和UI客戶端,同時該服務也充當代理。它在NuGet上可用。 –

1

您的服務和應用程序是否在不同的機器上運行?如果您的服務在您的應用程序未運行時發送通知,您希望在應用程序下次運行時收到通知嗎?如果是這樣,你最好的選擇是Message Queuing

+0

我從來沒有聽說過這個:)我會看看這個 – ArtoAle

相關問題