我制作了一个WPF示例,它以两种不同的方式使用网络服务(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;
}
并使用开始/结束方法和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;
}
这两种方法似乎执行完全相同的任务。
它们的优点和缺点是什么?你什么时候使用一个而不是另一个?
答案 0 :(得分:2)
对于远程服务的情况,我通常更喜欢使用回调而不是事件处理程序,因为它会导致更易读/可维护的代码(通过查看服务调用调用代码,我知道在调用完成时将执行哪些代码)。此外,在使用事件处理程序时,您需要注意不要多次声明它们。
答案 1 :(得分:0)
这只是品味问题。与技术前景没有区别。