【问题标题】:C# How to transfer reference void within main voidC#如何在main void中传输引用void
【发布时间】:2012-11-07 11:11:46
【问题描述】:

这可能是一个(另一个)菜鸟问题,但我不知道该怎么做。

我的私有方法中有一段代码引用静态方法。

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”的来源,我不知道如何让它工作。

【问题讨论】:

  • 你想用“格式化”替换“e.Result”吗?
  • 不,“格式化”是最终结果。 “e.Result”是获得最终结果所必需的信息。

标签: c# .net static webclient void


【解决方案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...

【讨论】:

  • 我明白你的意思,我开始明白了。有没有办法等待结果准备好,然后再继续?
  • 太棒了!它工作得很好,谢谢!一直在学习;)
猜你喜欢
  • 2018-03-16
  • 2012-03-10
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 2014-07-23
  • 1970-01-01
  • 2010-10-12
相关资源
最近更新 更多