2014-10-07 38 views
1

我正在构建此方法的过程中,该方法仅返回网页的内容。但是,我无法返回内容下载后触发的事件,因此得到此错误:返回内部事件完成处理程序

因为'System.Net.DownloadStringCompletedEventHandler'返回void,所以返回关键字后面不能有对象表达式。

如果我把事件之外的回报,它不会着火下载完成后,返回void并因此使这个没用

string ScrapePage(string url) 
     { 
      WebClient GetArticleHTML = new WebClient(); 
      GetArticleHTML.DownloadStringAsync(new Uri(url, UriKind.RelativeOrAbsolute)); 
      GetArticleHTML.DownloadStringCompleted += (s, x) => 
      { 
       return x.Result; 
      }; 
     } 

回答

1

欢迎异步编程的世界。

由于事件通常在.NET中返回void,所以无法返回事件。事实上,通过试图做到这一点,你试图强制它是同步的!如果你的代码有效,那么当事件处理程序被调用时,ScrapePage将会很长时间完成,并且你将返回值,因为函数已经返回,所以没有任何东西。

所以,你有两个选择:

  1. 使该方法同步(使用DownloadString而不是异步版本)和它完成后返回。这可能是不可能的,因为你在WP8上,它喜欢异步方法。

  2. 明白ScrapePage方法只是开始字符串下载。事件处理程序将需要通知谁想要字符串完成下载。然后它可以将方法调用中的下载字符串作为参数传递。

实际上,你会想做(2),特别是如果这是在UI线程上。

相关问题