2010-12-16 105 views
0

我發現了一個巨大的頁面上進行高效的異步調用以最小的努力在這裏Web服務:異步回調函數完成後是否會引發事件?

http://www.jaylee.org/post/2010/06/22/WP7Dev-Using-the-WebClient-with-Reactive-Extensions-for-Effective-Asynchronous-Downloads.aspx

我感到困惑的是,我在哪裏把我想執行的代碼後的反應是從服務器收到?發生這種情況時系統是否發生事件?在調用asyncdownload之後簡單地放置代碼並不會提供此功能。


我應該更清楚了;我的項目中有這樣的代碼:

private void SearchBarcode(object sender, EventArgs e) 
    { 
     WebClient wc = new WebClient(); 

     var o = Observable.FromEvent<DownloadStringCompletedEventArgs>(wc, "DownloadStringCompleted") 

          // Let's make sure that we’re on the thread pool 
          .ObserveOn(Scheduler.ThreadPool) 

          // When the event fires, just select the string and make 
          // an IObservable<string> instead 
          .Select(newString => ProcessString(newString.EventArgs.Result)) 

          // Now go back to the UI Thread 
          .ObserveOn(Scheduler.Dispatcher) 

          // Subscribe to the observable, and set the label text 
          .Subscribe(s => parserInput = s); 

     wc.DownloadStringAsync(new Uri("http://api.search.live.net/xml.aspx?Appid=appidhere&query=barcodenumber&sources=web")); 
    } 

我看不到我可以放置DownloadCompleted事件調用的位置。 SearchBarcode是一個圖像的onclick處理程序; SearchBarcode執行後控件的位置在哪裏?我想操縱parserInput的值並調用另一個傳遞這些值的xaml頁面。我嘗試添加一個void DownloadCompleted(object sender,DownloadStringCompletedEventArgs e),但它顯然不會被調用。我在這裏錯過了什麼? :(

+1

您是否請詳細解釋一下您想要的內容?您在「DownloadCompleted」事件處理程序中放置的代碼將在下載完成後運行。所以你想要什麼比它更多?或者有什麼問題呢? – 2010-12-16 09:37:17

+2

僅供參考,會引發事件。錯誤被拋出。 – 2010-12-16 11:10:13

+0

夥計們,我編輯了我的問題,以更具體。感謝您的期待:D – Freakishly 2010-12-17 19:03:47

回答

1

您可以在回調結束把這個邏輯。

在您鏈接的樣本,這就是他與調度員DownloadCompleted做。

這是一個簡單的項目,我寫了演示如何使用HttpWebRequest的的,在ResponseCallback結束,你會看到...

Dispatcher.BeginInvoke(() => { httpWebRequestTextBlock.Text = contents; }); 

...更新UI。

隨意擷取此程式碼並使用您的網址。

WebClient, HttpWebRequest and the UI Thread on Windows Phone 7

+0

感謝米克,請參閱上面編輯的問題:) – Freakishly 2010-12-17 19:01:24

+0

不用擔心,我已經添加了一個工作示例項目,您可以將您的url/ui更新邏輯插入。看起來你現在已經選擇了一個Rx(Reactive Extensiosn)示例..是你初始需求的一部分嗎? – 2010-12-17 23:40:32

+0

我和Rx一起去的原因是因爲它完成了和HttpWebRequest一樣的事情(不會阻塞UI線程)。我瀏覽了你的代碼,看起來非常簡單。雖然我的項目不*需要* Rx,我想不改變它們的工作原理:P問題是,我仍然無法使回調函數正常工作。我試過void DownloadStringCompleted(object sender,DownloadStringCompletedEventArgs e)及其所有變體,但仍然沒有運氣:( – Freakishly 2010-12-19 22:12:52

1

你可以把你在DownloadCompleted方法,被稱爲與您下載的結果代碼。請注意,任何代碼都將在主線程上執行。如果您有繁重的工作要做,我建議HTTPWebRequest

+0

Hiya Thomas,我不熟悉HTTPWebRequest及其在此上下文中的用法。請給我一個鏈接嗎? – Freakishly 2010-12-17 19:03:05

+0

它將以與Webclient相同的方式工作,但在回調中您將有更多的代碼訪問UI線程。 doc:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx使用示例:http://social.msdn.microsoft.com/Forums/en-US/windowsphone7series/thread/594e1422-3b69-4cd2-a09b-fb500d5eb1d8 – 2010-12-17 20:11:00

+0

謝謝...這是一個不錯的頁面,有一個很好的例子:)我會嘗試添加一個DownloadCompleted方法,並在將您的答案標記爲正確的方法之前讓它工作。 – Freakishly 2010-12-17 21:45:27

相關問題