Я сделал пример 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;
}
и с помощью методов 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;
}
Эти два подхода, похоже, выполняют ту же задачу.
Каковы их преимущества и недостатки? Когда вы будете использовать один, а не другой?
В случае с удаленными службами я обычно предпочитаю использовать обратные вызовы вместо обработчиков событий, так как он приводит к более читабельному/поддерживаемому коду (просто просматривая код вызова служебного вызова, я знаю, какой код будет выполнен, когда вызов завершается). Более того, при использовании обработчиков событий вам нужно не раз декларировать их несколько раз.
Это просто вопрос вкуса. Никакой разницы с техническими перспективами.