我正在瀏覽WebServices上的MSDN文檔。 Here和here,這兩個鏈接都是關於調用webservice並等待響應,這也是我在異步實現時看到的一個大趨勢。爲什麼要等待異步Web服務調用
我不明白「爲什麼我們需要等待服務電話返回」?而且,如果我們在等待爲什麼不進行同步呼叫。 「異步呼叫跟着等待」和「同步呼叫」有什麼區別?
我正在瀏覽WebServices上的MSDN文檔。 Here和here,這兩個鏈接都是關於調用webservice並等待響應,這也是我在異步實現時看到的一個大趨勢。爲什麼要等待異步Web服務調用
我不明白「爲什麼我們需要等待服務電話返回」?而且,如果我們在等待爲什麼不進行同步呼叫。 「異步呼叫跟着等待」和「同步呼叫」有什麼區別?
有用的是,異步調用需要做的事情,而你去做別的事情。有兩種方法可以做到這一點:
你不會使用WaitHandle的做這兩件事情。然而,WaitHandle的類能夠爲客戶進行異步調用和等待:
WaitHandle.WaitOne
)WaitHandle.WaitAny
)或WaitHandle.WaitAll
)返回結果。
換句話說,如果您在返回多個結果異步Web服務使用WaitOne
或WaitAny
,你可以從你的Web服務調用獲得一個結果,並過程它,而你正在等待其餘結果。
使用異步調用可以釋放您的應用程序在等待響應時執行其他操作。由於等待Web服務器響應的時間相當長(在計算機週期中),這段時間可用於更好的事情,例如顯示狀態更新或執行其他工作。
例如,如果您有一個執行復雜計算的程序,並且該計算的步驟包括使用來自遠程Web服務的一些參考數據。通過在計算開始時異步調用Web服務,繼續可以在本地執行的計算部分,然後在可用於完成計算的情況下使用Web服務調用的結果,可以減少計算的總時間計算。
由於您的應用程序代碼不是被阻止等待Web服務響應,您可以利用該等待時間來爲用戶帶來好處。
另一個原因是縮放,特別是在調用其他Web服務的網站中。通過使用異步頁面方法(或任務),IIS可以更有效地擴展您的應用程序,方法是將等待異步Web請求的頁面推遲到所謂的「IO線程」,釋放主要ASP.NET工作線程以提供更多服務網頁。
但是,調用result.AsyncWaitHandle.WaitOne()會阻止應用程序,但是否定了這一點?這就是@ noob2487正在做的,我想。 – 2009-10-15 03:40:11
@Matt:沒錯。 – 2009-10-15 03:54:13
您不必立即致電。你也不必阻止你的線程。你可以使用Page.RegisterAsyncTask,或者你可以使用[WebMethod]的BeginXXX/EndXXX語法,讓ASP.NET等着你。 – 2009-10-15 04:10:55
您正在鏈接的第一個示例發出異步調用,然後立即等待結果。除了將工作分解到另一個線程外,就我所知,這與同步調用之間幾乎沒有什麼區別。
然而,另一個例子說的是一次完成多個異步調用。如果是這種情況,則啓動所有呼叫,然後等待,因爲這些呼叫可以並行執行。異步調用的
我明白你對多個異步調用的看法,但這不意味着每個來電者都必須等待嗎? – 2009-10-15 03:50:16
您可以從一個線程觸發多個調用,並等待這些線程返回。 – 2009-10-15 03:54:22
您確實可以啓動多個請求,並使用WaitHandle.WaitAll()來等待所有請求完成。 – 2009-10-15 04:12:27
一個非常實用的用法是這樣的東西
http://i.msdn.microsoft.com/Bb760816.PB_oldStyle%28en-us,VS.85%29.png
如果你想更新UI,而你等待「服務器」做一些事情,你需要做異步調用。如果您進行同步調用,您的代碼將停滯不前,但如果您進行異步調用,則可以更新UI或甚至讓用戶在等待回調期間執行其他操作。這超出了用戶界面,您可以進行異步調用來啓動一些非關鍵任務,並繼續處理您的代碼,並且如果結果不重要,甚至可能不會註冊回調。
如果您在等待異步調用時沒有任何操作,那麼它的用處不大。
這是有道理的。如果我在這種情況下進行同步調用,則應用程序將超時。所以異步調用,將允許我們在向用戶顯示進度條的同時等待響應。如果可能的話,你可以發佈一些有用的鏈接與類似的實現(或我可以谷歌它也)。謝謝。 – 2009-10-15 04:17:49
這一切都取決於你在做什麼樣的開發(贏取窗體,網頁,silverlight?)這裏有一個雖然只是在第1頁googlehttp://msdn.microsoft.com/en-us/library/aa480520.aspx – TJB 2009-10-15 04:21:03
異步調用後跟一個等待的可能用法之一是異步操作通常支持取消,而阻止調用不支持。結合.NET 4.0中的CancellationToken模式(或類似的.NET4之前的自定義模式),您可以創建一個似乎是同步但可以輕鬆取消的操作。
這就是我困惑的地方。我明白需要異步調用,但是等到調用失敗後再等待整個目的。實際上,我相信我們做ASP.NET頁面異步調用的默認方式也會讓應用程序等待,直到它得到響應。我會嘗試找到更多信息並在此發佈。 – 2009-10-15 03:50:56
@ Noob2487,看我的編輯。 – 2009-10-15 03:55:01
@ Robert/@ Brian:所以你建議一次打多個電話。我如何知道服務器已準備好同時處理呼叫,或者它是否會扼殺網絡或服務器?我們在這裏沒有使用消息隊列。 – 2009-10-15 04:24:38