2

我制作了一个 WPF 示例,它以两种不同的方式使用Web 服务www.webservicex.com/globalweather.asmx ):

有这样的事件

public Window1()
{
    InitializeComponent();
    DataContext = this;

    Location = "loading...";
    Temperature = "loading...";
    RelativeHumidity = "loading...";

    client.GetWeatherCompleted += 
            new EventHandler<GetWeatherCompletedEventArgs>(client_GetWeatherCompleted);
    client.GetWeatherAsync("Berlin", "Germany");
}

void client_GetWeatherCompleted(object sender, GetWeatherCompletedEventArgs e)
{
    XDocument xdoc = XDocument.Parse(e.Result);

    Location = xdoc.Descendants("Location").Single().Value;
    Temperature = xdoc.Descendants("Temperature").Single().Value;
    RelativeHumidity = xdoc.Descendants("RelativeHumidity").Single().Value;
}

并使用像这样的Begin/End 方法和 IAsyncResult

public Window1()
{
    InitializeComponent();
    DataContext = this;

    Location = "loading...";
    Temperature = "loading...";
    RelativeHumidity = "loading...";

    client.BeginGetWeather("Berlin", "Germany", new AsyncCallback(GotWeather), null);
}

void GotWeather(IAsyncResult result)
{
    string xml = client.EndGetWeather(result).ToString();
    XDocument xdoc = XDocument.Parse(xml);

    Location = xdoc.Descendants("Location").Single().Value;
    Temperature = xdoc.Descendants("Temperature").Single().Value;
    RelativeHumidity = xdoc.Descendants("RelativeHumidity").Single().Value;

}

这两种方法似乎执行完全相同的任务。

它们的优点和缺点是什么?你什么时候用一个而不用另一个?

4

2 回答 2

2

对于远程服务,我通常更喜欢使用回调而不是事件处理程序,因为它导致代码更具可读性/可维护性(通过查看服务调用调用代码,我知道调用完成时将执行哪些代码)。此外,在使用事件处理程序时,您需要注意不要多次声明它们。

于 2009-11-04T10:04:41.893 回答
0

那只是口味问题。与技术前景没有区别。

于 2009-11-04T10:05:36.933 回答