2009-10-15 85 views
3

我正在瀏覽WebServices上的MSDN文檔。 Herehere,這兩個鏈接都是關於調用webservice並等待響應,這也是我在異步實現時看到的一個大趨勢。爲什麼要等待異步Web服務調用

我不明白「爲什麼我們需要等待服務電話返回」?而且,如果我們在等待爲什麼不進行同步呼叫。 「異步呼叫跟着等待」和「同步呼叫」有什麼區別?

回答

4

有用的是,異步調用需要做的事情,而你去做別的事情。有兩種方法可以做到這一點:

  1. Provide a callback method for the asynchronous handle, so that it can notify you when it is completed, or

  2. Periodically check the asynchronous handle to see if its status has changed to "completed."

你不會使用WaitHandle的做這兩件事情。然而,WaitHandle的類能夠爲客戶進行異步調用和等待:

  • 一個XML Web服務 (WaitHandle.WaitOne
  • 第一的許多XML Web服務 (WaitHandle.WaitAny)或
  • 所有的許多XML Web服務 (WaitHandle.WaitAll

返回結果。

換句話說,如果您在返回多個結果異步Web服務使用WaitOneWaitAny,你可以從你的Web服務調用獲得一個結果,並過程它,而你正在等待其餘結果

+0

這就是我困惑的地方。我明白需要異步調用,但是等到調用失敗後再等待整個目的。實際上,我相信我們做ASP.NET頁面異步調用的默認方式也會讓應用程序等待,直到它得到響應。我會嘗試找到更多信息並在此發佈。 – 2009-10-15 03:50:56

+0

@ Noob2487,看我的編輯。 – 2009-10-15 03:55:01

+0

@ Robert/@ Brian:所以你建議一次打多個電話。我如何知道服務器已準備好同時處理呼叫,或者它是否會扼殺網絡或服務器?我們在這裏沒有使用消息隊列。 – 2009-10-15 04:24:38

1

使用異步調用可以釋放您的應用程序在等待響應時執行其他操作。由於等待Web服務器響應的時間相當長(在計算機週期中),這段時間可用於更好的事情,例如顯示狀態更新或執行其他工作。

例如,如果您有一個執行復雜計算的程序,並且該計算的步驟包括使用來自遠程Web服務的一些參考數據。通過在計算開始時異步調用Web服務,繼續可以在本地執行的計算部分,然後在可用於完成計算的情況下使用Web服務調用的結果,可以減少計算的總時間計算。

由於您的應用程序代碼不是被阻止等待Web服務響應,您可以利用該等待時間來爲用戶帶來好處。

另一個原因是縮放,特別是在調用其他Web服務的網站中。通過使用異步頁面方法(或任務),IIS可以更有效地擴展您的應用程序,方法是將等待異步Web請求的頁面推遲到所謂的「IO線程」,釋放主要ASP.NET工作線程以提供更多服務網頁。

+4

但是,調用result.AsyncWaitHandle.WaitOne()會阻止應用程序,但是否定了這一點?這就是@ noob2487正在做的,我想。 – 2009-10-15 03:40:11

+0

@Matt:沒錯。 – 2009-10-15 03:54:13

+0

您不必立即致電。你也不必阻止你的線程。你可以使用Page.RegisterAsyncTask,或者你可以使用[WebMethod]的BeginXXX/EndXXX語法,讓ASP.NET等着你。 – 2009-10-15 04:10:55

1

您正在鏈接的第一個示例發出異步調用,然後立即等待結果。除了將工作分解到另一個線程外,就我所知,這與同步調用之間幾乎沒有什麼區別。

然而,另一個例子說的是一次完成多個異步調用。如果是這種情況,則啓動所有呼叫,然後等待,因爲這些呼叫可以並行執行。異步調用的

+0

我明白你對多個異步調用的看法,但這不意味着每個來電者都必須等待嗎? – 2009-10-15 03:50:16

+1

您可以從一個線程觸發多個調用,並等待這些線程返回。 – 2009-10-15 03:54:22

+0

您確實可以啓動多個請求,並使用WaitHandle.WaitAll()來等待所有請求完成。 – 2009-10-15 04:12:27

3

一個非常實用的用法是這樣的東西

http://i.msdn.microsoft.com/Bb760816.PB_oldStyle%28en-us,VS.85%29.png

如果你想更新UI,而你等待「服務器」做一些事情,你需要做異步調用。如果您進行同步調用,您的代碼將停滯不前,但如果您進行異步調用,則可以更新UI或甚至讓用戶在等待回調期間執行其他操作。這超出了用戶界面,您可以進行異步調用來啓動一些非關鍵任務,並繼續處理您的代碼,並且如果結果不重要,甚至可能不會註冊回調。

如果您在等待異步調用時沒有任何操作,那麼它的用處不大。

+0

這是有道理的。如果我在這種情況下進行同步調用,則應用程序將超時。所以異步調用,將允許我們在向用戶顯示進度條的同時等待響應。如果可能的話,你可以發佈一些有用的鏈接與類似的實現(或我可以谷歌它也)。謝謝。 – 2009-10-15 04:17:49

+0

這一切都取決於你在做什麼樣的開發(贏取窗體,網頁,silverlight?)這裏有一個雖然只是在第1頁googlehttp://msdn.microsoft.com/en-us/library/aa480520.aspx – TJB 2009-10-15 04:21:03

0

異步調用後跟一個等待的可能用法之一是異步操作通常支持取消,而阻止調用不支持。結合.NET 4.0中的CancellationToken模式(或類似的.NET4之前的自定義模式),您可以創建一個似乎是同步但可以輕鬆取消的操作。