2009-04-28 97 views
0

我有一個ASP.NET web服務(.asmx)與一個簡單的方法,從數據庫中讀取一些同步調用(ExecuteReader)並返回結果。有什麼方法可以優化線程池的使用(即通過調用異步調用(BeginExecuteReader))而不改變方法的簽名?有什麼辦法讓ASP.NET webservice方法使用異步方法?

意圖是在數據庫操作正在進行時不阻塞線程池線程;並不是要通過並行執行多個操作來加快速度。

回答

3

其實答案是。見Asynchronous XML Web Service Methods

雖然您使用Begin *和End *方法創建異步Web方法,但.NET將僅在WSDL中創建單個操作。如果您仔細考慮,這一點很明顯 - Java客戶端如何處理IAsyncResult

客戶端可以同步或異步調用操作。

1

是的,你基本上可以自由地做你想要的服務請求響應。但是,如果你只有一個查詢,這不會有太大用處。如果你需要2個或更多的查詢,它變得有趣。


然後當然你必須收集所有的結果,正如Alex Lyman指出的那樣。 ASP.NET WebPage對此有特別的支持,這就是爲什麼我確信它是可能的。

+0

亞歷克斯澄清你的答案。 – 2009-04-29 00:43:43

-2

我不明白這是如何工作的,當一個請求進入您的web服務時,將從池中分配一個線程來處理請求,如果您從該線程進行異步調用,那麼您的請求線程結束,客戶端不會得到任何結果。

簡答案是 人們似乎只是在閱讀本行並downvoting :)用戶詢問我們是否可以在同步webservice調用中執行異步調用,這肯定可以通過使用WaitHandles來實現,但可以在用戶的特定情況下沒有意義。

+0

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx關於如何使用Pages進行此操作。可能無法使用網絡服務,但不能說明原因。 – Aleris 2009-04-28 19:52:38

+0

我也不明白downvoting。 – 2009-04-29 00:42:25

+0

約翰桑德斯是正確的。當您創建Begin *和End *方法時,只會顯示*方法。它對外界透明。 – 2009-04-29 00:58:38

2

和您提供的,用一個單一的異步調用的具體使用情況,它不會是值得的,但是,是的,你可以從一個Web服務調用異步調用:

[WebMethod] 
public SomeResult SynchronousMethod() { 
    IAsyncResult someWork = BeginSomeAsyncWork(); 
    IAsyncResult otherWork = BeginOtherAsyncWork(); 
    WaitHandle[] all = new WaitHandle[] { someWork.AsyncWaitHandle, otherWork.AsyncWaitHandle }; 
    // TODO: Do some synchronous work here, if you need to 
    WaitHandle.WaitAll(all); /* this is the important part, it waits for all of the async work to be complete */ 
    var someWorkResult = EndSomeAsyncWork(someWork); 
    var otherWorkResult = EndSomeAsyncWork(otherWork); 
    // TODO: Process the results from the async work 
    // TODO: Return data to the client 
} 

重要這裏的東西是WaitHandle.WaitAll,它會阻塞,直到所有的異步工作完成。如果您可以單獨處理結果,則可以使用WaitHandle.WaitAny代替,但代碼變得更加複雜,並且有點超出問題的範圍。