返回事件内部完成处理程序

时间:2014-10-07 23:06:56

标签: c# windows-phone-8 windows-phone

我正在构建此方法,只返回网页的内容。但是,我无法返回内容下载后触发的事件,收到此错误:

由于'System.Net.DownloadStringCompletedEventHandler'返回void,因此返回关键字后面不能包含对象表达式。

如果我在活动之外接受回报,则在下载完成后不会启动,返回无效并因此使此无效

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

1 个答案:

答案 0 :(得分:1)

欢迎来到异步编程世界。

您无法在事件中返回,因为事件通常在.NET中返回void。事实上,通过尝试这样做,你试图强迫它同步!如果您的代码有效,那么在调用事件处理程序时,ScrapePage将很快完成,并且您将返回值,好吧,没有,因为函数已经返回了!

所以你有两个选择:

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

  2. 了解ScrapePage方法只需启动字符串下载。事件处理程序需要通知任何想要完成下载的字符串的人。然后,它可以将方法调用中下载的字符串作为参数传递。

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