2010-12-16 86 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

相关问题