2011-09-21 181 views
2

我想要實現一個WCF服務,該服務會立即響應調用者,但會排隊等待稍後處理的異步作業。做這件事的最好方法是什麼?我已閱讀how to implement an asynchronous service operation上的MSDN文章,但該解決方案似乎仍然需要完成任務才能響應調用者。如何創建異步WCF服務

+0

如果是提交和遺忘操作,則可能需要執行線程或委託,並在Web服務請求立即完成時運行該操作。 但問題是:當流程完成後,您是否需要通知客戶?這就是當事情變得棘手時,因爲這需要服務訂閱或輪詢客戶端輪詢來檢查作業狀態。以下可能會有所幫助:http://stackoverflow.com/questions/1537302/subscribe-to-events-within-a-wcf-service –

+0

@RickStrahl當流程完成時,我確實需要通知客戶。但是,他們有一套自己的WCF服務,我可以將這些結果發佈到。聽起來好像使用代理是最簡單的方法。 –

回答

1

有很多方法可以完成此操作,具體取決於您想要執行的操作以及您正在使用的技術(例如,除非您使用silverlight,否則您可能不需要讓應用程序異步調用該服務)實現你的目標將是讓你的服務方法啓動一個線程來執行大量的處理並立即返回。

另一種方法是創建某種請求(例如,在某種數據存儲中創建條目)並返回。另一個過程(例如,Windows服務等)可以接收請求並執行處理。

+0

所以你建議我做一些事情,比如創建一個委託來處理所有繁重的工作,並在發回初始響應之前調用BeginInvoke? –

+0

是的。線程的職責之一是在完成處理任務時通知他們結束。 – Maciej

+0

你可能想要考慮使用一個線程池,如[本帖]所示(http://stackoverflow.com/questions/2240251/wcf-is-it-safe-to-spawn-an-asynchronous-worker-thread-上的服務器) – Maciej

1

任何WCF服務可以由異步 -

一個有關WCF的好處之一是,你可以寫同步服務。當您在客戶端添加ServiceReference時,您可以選擇生成異步方法。

這會自動使服務調用異步。該服務完成後將返回,但客戶端將獲得兩種方法 - BeginXXX和EndXXX,以及XXXAsync +一個XXXCompleted事件,它們都允許完全異步操作。

+0

這裏的問題是我不控制客戶端代碼。客戶端實際上創建了我的WCF服務必須遵守的接口,並且從我所知道的情況來看,他們只是想將消息發送到我的WCF服務並立即響應。然後,當我的服務器成功處理了初始請求時,他們希望它發送一個單獨的請求到他們的最後。 實質上,他們希望我的WCF服務異步工作,而不是更改其客戶端代碼以異步調用我的服務。 –