4

WPプログラミングの学習を始めたばかりなので、これは少しばかげた質問かもしれません...

1 つの Web サービスからいくつかの異なる方法でデータを取得するアプリを開発しています。そこで、このすべての Web サービス フェッチ コードを 1 つのクラスにまとめることにしました。

class WebApiWorker
{
    public async Task<List<GeocodeResponse>> GetGeocodeAsync(String address)
    {
        String url = "http://api.com&search=" + HttpUtility.UrlEncode(address) + "&format=json";

        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest.Method = "GET";

        HttpWebResponse response = (HttpWebResponse) await httpWebRequest.GetResponseAsync();

        Stream responseStream = response.GetResponseStream();
        string data;

        using (var reader = new System.IO.StreamReader(responseStream))
        {
            data = reader.ReadToEnd();
        }
        responseStream.Close();

        var geocodeResponse = JsonConvert.DeserializeObject<List<GeocodeResponse>>(data);
        return geocodeResponse;

    }
}

しかし、「メインアプリ」コードからこれをどのように呼び出すべきか、次のようなことを試しています:

WebApiWorker webApi = new WebApiWorker();
var geoResponse = await webApi.GetGeocodeAsync("address");

これの何が問題なのか、コンパイラ エラーが発生します。「await」演算子は非同期メソッド内でのみ使用できます。このメソッドを「async」修飾子でマークし、戻り値の型を「Task」に変更することを検討してください。

すべての提案を歓迎します。

4

2 に答える 2

4

「メインアプリ」コードのメソッドにも「async」修飾子があることを確認してください。

public async Task GetAddress()
{
    WebApiWorker webApi = new WebApiWorker();
    var geoResponse = await webApi.GetGeocodeAsync("address");
}
于 2013-06-13T18:03:30.297 に答える
0

これに対する答えは、応答から何を求めているかによって少し異なります。結果をすぐに使用しますか?もしそうなら、実際には非同期機能をまったく使用しておらず、同期的な関数の別のバージョンを作成することができます。呼び出し関数が後で続行することを意図している場合は、Chris (およびコンパイラ) が言ったようにしてください。呼び出し関数を非同期にします。

最終的に、ルート呼び出し元が非同期である必要がないことは事実です。通常、これは何も返さない void メソッドになります。(実際、前述の void は、非同期関数が返す前に返されます)

于 2013-06-13T18:06:38.123 に答える