返回内部事件完成处理程序
问题描述:
我正在构建此方法的过程中,该方法仅返回网页的内容。但是,我无法返回内容下载后触发的事件,因此得到此错误:返回内部事件完成处理程序
因为'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;
};
}
答
欢迎异步编程的世界。
由于事件通常在.NET中返回void
,所以无法返回事件。事实上,通过试图做到这一点,你试图强制它是同步的!如果你的代码有效,那么当事件处理程序被调用时,ScrapePage
将会很长时间完成,并且你将返回值,因为函数已经返回,所以没有任何东西。
所以,你有两个选择:
使该方法同步(使用
DownloadString
而不是异步版本)和它完成后返回。这可能是不可能的,因为你在WP8上,它喜欢异步方法。明白
ScrapePage
方法只是开始字符串下载。事件处理程序将需要通知谁想要字符串完成下载。然后它可以将方法调用中的下载字符串作为参数传递。
实际上,你会想做(2),特别是如果这是在UI线程上。