2009-02-09 57 views
3

這裏是規格:使用在本地計算機上 .NET使用外部應用程序實現客戶端/服務器排隊模型的最佳方法?

  • 客戶端發起請求到執行模擬服務器WPF WinForms應用程序

    1. 多個客戶端。該啓動應該可以通過網絡服務進行,但也可以使用其他建議
    2. 請求在服務器上排隊
    3. 服務器通過Web服務向仿真模型發送連續請求。
    4. 服務器通知客戶端,模擬完成

    另外一個要求是有一個客戶取消他們以前提出的要求。請注意,我們不必擔心向管道發送太多數據,我們只會發送確認信息,說明某個模擬運行已完成(或失敗)。

    首先,我想我可以用一個asmx網絡服務,但現在我認爲這可能是笨拙的。 WCF似乎是另一種選擇,但我不熟悉它,它似乎比我需要的功能複雜得多。

    任何想法?

  • +0

    不要使用1.)#text use 1. #text。 SO會爲你做一個OL。 – 2009-02-09 08:14:22

    回答

    2

    客戶:要獲得完成通知調用來自客戶端的Web服務時,您將需要使用異步設計模式。如果您使用「添加Web引用」來創建客戶端代理,則會爲您生成異步模式方法。參見:「Access Web Services Asynchronously in .NET Design Patterns」。

    服務器:香草的.Net 2.0 ASMX Web服務可以排隊服務器上的串行處理的來電。您可以使用BackgroundWorker類構建一個簡單的調度程序。調度程序接收每個傳入請求並將其分配給後臺線程。爲了序列化線程,工作者方法在模擬調用周圍放置一個lock。請參閱使用BackgroundWorker線程的this example

    取消:爲了處理消除在服務器與它的客戶端請求響應中返回一個唯一的ID,並插入ID和相關背景workworker引用到字典中。 Web服務上的CancelSimulation方法接受id,在字典中查找BackgroundWorker ref並調用其CancelAsync方法。任務完成或取消時刪除字典條目。字典需要由所有Web服務調用共享,因此它應該是靜態的/共享的。幸運的是,靜態dictionary是線程安全的。

    +0

    這是偉大的湯姆,但我應該如何構建服務器組件? asmx Web服務,Windows服務或WCF服務? – Alex 2009-02-09 02:47:51

    +0

    .Net 2.0 asmx Web服務正常工作。它內置了對異步模式的支持。確實,排隊內置於WCF(我不是指msmq,而是序列化調用),但BAackgroundWorker更簡單。 – 2009-02-09 02:59:50

    +0

    湯姆謝謝你擴大你的答案。今晚我會試着實施這個,毫無疑問,我明天早上會有幾個問題! 謝謝大家回覆。 – Alex 2009-02-09 06:46:04

    0

    你應該仔細看看WCF。我已經編寫了一個自定義庫,用於處理一些奇怪的配置問題,但是您可以使用WCF在幾十行代碼中編寫出色的Web服務。它具有高度的可擴展性。唯一的問題是,它需要一段時間才能「獲得」,但一旦你真的做到了,真的很簡單。祝你好運。

    1

    WCF似乎是另一個 的選擇,但我不熟悉它 ,它似乎比 我需要的功能要複雜得多。

    我會強烈建議你採取一個很好看WCF - 是的,這可能是在第一次更艱鉅了一點,但它給你一個很大的靈活性通過配置的方式,而不是代碼到特定的傳輸媒介(例如網絡服務與消息隊列)。

    由於您明確表示客戶端會將請求發送到服務器上的隊列 - 爲什麼不首先使用基於隊列的消息系統(如MSMQ)呢?

    使用服務器和客戶端上的WCF,您可以快速切換使用MSMQ和使用「常規」HTTP SOAP調用,而不是使用例如「一個REST調用 - 全部在配置中。這種靈活性值得投入一點時間來學習它,恕我直言。

    1

    你應該看看WCF。使用Web服務+輪詢可能會導致您的服務器中斷(除非您沒有那麼多的客戶端) - 只需查看Twitter即可。 WCF有一個永久連接,應該完全適合你。

    至於排隊,添加System.Messaging作爲參考,並使用MSMQ。我不記得是否有WCF的MSMQ傳輸,但我相信你可以找到一個。使用這將會一石二鳥。如果您想使用MSMQ,您的服務器需要位於Windows域中。

    否則,我強烈建議您將事件寫入數據庫,並在工作線程完成時從那裏選取它們。將它們保留在內存隊列中不是很容錯。

    相關問題