这可能是一个(另一个)noob问题,但我不知道该怎么做。
我在一个引用静态方法的私有方法中有一段代码。
using (WebClient wc = new WebClient())
{
wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
wc.DownloadStringAsync(new Uri(requestUri));
}
它引用的静态方法:
static void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
var xmlElm = XElement.Parse(e.Result);
var status = (from elm in xmlElm.Descendants()
where elm.Name == "status"
select elm).FirstOrDefault();
if (status.Value.ToLower() == "ok")
{
var res = (from elm in xmlElm.Descendants()
where elm.Name == "formatted_address"
select elm).FirstOrDefault();
formatted = res.Value;
}
}
现在我需要静态方法的内容来替换WebClient的内容。 像:
using (WebClient wc = new WebClient())
{
var xmlElm = XElement.Parse(e.Result);
var status = (from elm in xmlElm.Descendants()
where elm.Name == "status"
select elm).FirstOrDefault();
if (status.Value.ToLower() == "ok")
{
var res = (from elm in xmlElm.Descendants()
where elm.Name == "formatted_address"
select elm).FirstOrDefault();
formatted = res.Value;
}
}
由于我不确定“e”的来源,我不知道如何让它发挥作用。
答案 0 :(得分:1)
您似乎忽略了异步调用的重点。这一点的重点是开始执行异步方法然后继续使用你的代码忘记所有方法,只留下回调方法来处理它的响应。
为了简单而简单,你无法以你想要的方式使用变量formatted
,因为你只能在回调方法中使用异步调用的结果。
但是,对于匿名方法,您可以使用这种lambda语法将整个代码放在同一个块中(不需要单独的方法):
myLabel.Text = "loading...<br />";
using (WebClient wc = new WebClient())
{
wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler((sender2, e2) =>
{
var xmlElm = XElement.Parse(e2.Result);
var status = (from elm in xmlElm.Descendants()
where elm.Name == "status"
select elm).FirstOrDefault();
if (status.Value.ToLower() == "ok")
{
var res = (from elm in xmlElm.Descendants()
where elm.Name == "formatted_address"
select elm).FirstOrDefault();
myLabel.Text = res.Value;
}
else
{
myLabel.Text = "Bad status: " + status.Value;
}
});
wc.DownloadStringAsync(new Uri(requestUri));
}
例如,一旦它们准备就绪,这将在页面中填充结果。
如果您想等到加载完成,只需使用普通的DownloadString
方法:
string formatted = "";
using (WebClient wc = new WebClient())
{
string raw = wc.DownloadString(new Uri(requestUri));
var xmlElm = XElement.Parse(raw);
var status = (from elm in xmlElm.Descendants()
where elm.Name == "status"
select elm).FirstOrDefault();
if (status.Value.ToLower() == "ok")
{
var res = (from elm in xmlElm.Descendants()
where elm.Name == "formatted_address"
select elm).FirstOrDefault();
formatted = res.Value;
}
else
{
formatted = "Bad status: " + status.Value;
}
}
//use the variable as you wish...