2

編輯(再次):讓我簡化我的問題。我有一個Windows服務,它暴露了一些WCF終端用類似的方法:從Windows服務處理長時間運行的操作

int ExecuteQuery(string query) { 
    // asynchronously execute query that may take 1 second to 20 minutes 
    return queryId; 
} 

string GetStatus(int queryId) { 
    // return the status of the query (# of results so far, etc) 
} 

什麼是實現ExecuteQuery方法的最佳方法是什麼?我應該打電話ThreadPool.QueueUserWorkItem讓我的查詢進行嗎?

請注意,執行查詢後的實際工作是由負載均衡黑匣子完成的。我希望能夠同時進行多個查詢。

這個比喻是一個網絡瀏覽器,它可以同時下載多個文件,並且你有一個下載管理器可以跟蹤每個文件的狀態。

回答

1

要麼這是一個技巧性的問題,要麼是一件容易的事... ThreadPool.QueueUserWorkItem是當你想同時執行一段代碼時最簡單的方法。我相信你已經知道了,所以在技術上你已經回答了你自己的問題。

所以,如果這不是一個詭計的問題,那麼你是否問到如何通過ThreadPool.QueueUserWorkItem查詢?

+0

我想我可能在這裏大聲思考,並讓我的問題看起來比以前更復雜。有很多「建議」表示「不要過度使用ThreadPool,尤其是對於長時間運行的任務」。我只想看看是否有任何針對我的問題的建議。 – intoOrbit 2010-03-10 15:29:33

+1

有一種情緒反對在ThreadPool中使用「長時間運行」的任務,因爲如果任務正在等待另一個任務執行某項工作,並且該任務正在等待在同一個ThreadPool中執行,但是ThreadPool已滿,那麼排隊任務可能永遠不會被執行,並且會導致死鎖。即使在短時間運行的任務中也會發生這種情況我想如果有人遇到這個問題,那麼他們只是錯誤地設計了他們的程序。 – Kiril 2010-03-10 15:51:22

3

看看Microsoft Message Queuing (MSMQ)

微軟消息隊列(MSMQ)技術能夠在不同時間運行的應用程序跨異構網絡和系統可能暫時脫機的溝通。 MSMQ提供有保證的消息傳遞,有效的路由,安全性和基於優先級的消息傳遞。它可用於實現異步和同步消息傳遞場景的解決方案。

很高興知道Windows Communication Foundation(WCF)可以利用MSMQ提供的排隊服務。

+0

我的印象是,MSMQ需要相當數量的基礎設施。另外,在這種情況下,「誰」實際上會執行查詢? MSMQ只是中介嗎? – intoOrbit 2010-03-05 23:22:34

+0

@intoorbit:MSMQ需要安裝Windows組件,但它很容易使其工作。此外,當你得到它時,你會獲得一堆免費的超棒功能。是的,MSMQ只是提供消息,你仍然需要手動處理它們。它本身不能完成實際的處理,但它消除了在應用程序和服務之間建立通信基礎設施的負擔。 – 2010-03-06 00:48:26

+0

我編輯了我的問題以減少溝通渠道的重要性。但是,我打算檢查MSMQ,看它是否可以成爲我的解決方案的一部分。即使是暫時性的,時間依賴性的和非關鍵性的請求,你認爲這是值得的嗎? – intoOrbit 2010-03-08 21:29:13

0

添加到MSMQ答案中,如果考慮到將來的可伸縮性問題,可以考慮使用企業服務總線(ESB)來處理這些類型的事情。查看一個.NET示例的NServiceBus

1

我使用Windows服務進行非常類似的任務,效果很好。我使用數據庫表對請求和響應進行排隊,因爲它爲我提供了一個持久隊列,可以通過網絡從遠程ASP.Net應用程序訪問並通過事務進行併發控制。

計時器上的管理程序線程會在接收到的請求需要服務時產生工作人員。我使用單獨的數據庫表進行配置和控制,以便我可以管理服務並從應用程序暫停管理程序,而無需離開服務核心運行。記錄到單獨的表格是查看網絡應用程序和本地管理應用程序發生情況的便捷方式。

我不會爲長時間運行的線程使用ThreadPool,而是創建一個在其自己的線程中運行的工作程序類,並使用回調方法更新具有進度和完成狀態的主管。

+0

是的...這幾乎是我打算做的,在我的情況下,我甚至不需要將狀態持久化到數據庫。我問這個問題是因爲我認爲所有的生產者/消費者類型代碼都是經常這樣做的,必須有一些代碼或模式已經存在,我可以利用。 – intoOrbit 2010-03-08 21:31:23

0

我會用世界自然基金會(4.0):

你可以開始長期運行的事務,可以是處理在幾臺機器,在並行,故障支持,友好的編碼執行任務,你可以用AppFabric的管理它,它是免費的...

相關問題