2

2つの異なる方法でWebサービスwww.webservicex.com/globalweather.asmx )を使用するWPFの例を作成しました。

このようなイベントで:

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;

}

これらの2つのアプローチは、まったく同じタスクを実行するようです。

それらの長所と短所は何ですか?いつ一方を使用し、もう一方は使用しませんか?

4

2 に答える 2

2

リモートサービスの場合、通常、イベントハンドラーの代わりにコールバックを使用することを好みます。これは、コードが読みやすく、保守しやすいためです(サービス呼び出しの呼び出しコードを見るだけで、呼び出しが終了したときに実行されるコードがわかります)。さらに、イベントハンドラーを使用する場合は、イベントハンドラーを複数回宣言しないように注意する必要があります。

于 2009-11-04T10:04:41.893 に答える
0

それは好みの問題です。技術的な見通しとの違いはありません。

于 2009-11-04T10:05:36.933 に答える