我有一個ASP.NET web服務(.asmx)與一個簡單的方法,從數據庫中讀取一些同步調用(ExecuteReader)並返回結果。有什麼方法可以優化線程池的使用(即通過調用異步調用(BeginExecuteReader))而不改變方法的簽名?有什麼辦法讓ASP.NET webservice方法使用異步方法?
意圖是在數據庫操作正在進行時不阻塞線程池線程;並不是要通過並行執行多個操作來加快速度。
我有一個ASP.NET web服務(.asmx)與一個簡單的方法,從數據庫中讀取一些同步調用(ExecuteReader)並返回結果。有什麼方法可以優化線程池的使用(即通過調用異步調用(BeginExecuteReader))而不改變方法的簽名?有什麼辦法讓ASP.NET webservice方法使用異步方法?
意圖是在數據庫操作正在進行時不阻塞線程池線程;並不是要通過並行執行多個操作來加快速度。
其實答案是是。見Asynchronous XML Web Service Methods。
雖然您使用Begin *和End *方法創建異步Web方法,但.NET將僅在WSDL中創建單個操作。如果您仔細考慮,這一點很明顯 - Java客戶端如何處理IAsyncResult
?
客戶端可以同步或異步調用操作。
是的,你基本上可以自由地做你想要的服務請求響應。但是,如果你只有一個查詢,這不會有太大用處。如果你需要2個或更多的查詢,它變得有趣。
然後當然你必須收集所有的結果,正如Alex Lyman指出的那樣。 ASP.NET WebPage對此有特別的支持,這就是爲什麼我確信它是可能的。
我不明白這是如何工作的,當一個請求進入您的web服務時,將從池中分配一個線程來處理請求,如果您從該線程進行異步調用,那麼您的請求線程結束,客戶端不會得到任何結果。
簡答案是
人們似乎只是在閱讀本行並downvoting :)用戶詢問我們是否可以在同步webservice調用中執行異步調用,這肯定可以通過使用WaitHandles來實現,但可以在用戶的特定情況下沒有意義。
http://msdn.microsoft.com/en-us/magazine/cc163725.aspx關於如何使用Pages進行此操作。可能無法使用網絡服務,但不能說明原因。 – Aleris 2009-04-28 19:52:38
我也不明白downvoting。 – 2009-04-29 00:42:25
約翰桑德斯是正確的。當您創建Begin *和End *方法時,只會顯示*方法。它對外界透明。 – 2009-04-29 00:58:38
和您提供的,用一個單一的異步調用的具體使用情況,它不會是值得的,但是,是的,你可以從一個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代替,但代碼變得更加複雜,並且有點超出問題的範圍。
亞歷克斯澄清你的答案。 – 2009-04-29 00:43:43