异步回调函数在完成时会抛出一个事件吗?

时间:2010-12-16 09:26:49

标签: windows-phone-7 webservice-client system.reactive

我找到了一个很棒的页面,可以轻松地对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(对象发送者,Dow​​nloadStringCompletedEventArgs e)但显然没有被调用。我在这里错过了什么? :(

2 个答案:

答案 0 :(得分:1)

您可以将此逻辑放在回调的末尾。

在示例中,您链接了他正在使用DownloadCompleted中的Dispatcher进行的操作。

这是我编写的一个示例项目,演示了如何使用HttpWebRequest。在ResponseCallback结束时,您将看到......

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

...更新用户界面。

随意破解此代码并使用您的网址。

WebClient, HttpWebRequest and the UI Thread on Windows Phone 7

答案 1 :(得分:1)

您可以将代码放在DownloadCompleted方法中,该方法会根据您下载的结果进行调用。请注意,任何代码都将在主线程上执行。如果你有繁重的处理,我建议HTTPWebRequest