Windows Phone 8 - 获取多个街道名称

Windows Phone 8 - Getting Multiple Street Names

我为 Windows Phone 8.0 Silverlight App 创建了一个异步方法 GetStreetName

string streetname;

private async Task<string> GetStreetName(int i)
{
    MapAddress address;
    ReverseGeocodeQuery query = new ReverseGeocodeQuery();
    query.GeoCoordinate = Route[i].Item1;
    query.QueryCompleted += (s, e) =>
    {
        if (e.Error != null)
            return;

        address = e.Result[0].Information.Address;
        streetname = address.Street;
};
query.QueryAsync();
return streetname;
}

我在 for 循环中使用 await 运算符调用它:

for (int i = 0; i < Route.Count; i++)
{
       ListBox.Items.Add(await GetStreetName(i));
}

但我总是只返回第一个加载的地理位置的街道名称,我不知道为什么(我认为 await 运算符正在等待异步方法完成)。

其他信息:我刚刚看到这个简短的片段不是 100% 清楚,街道名称和路线是全局的 "variables",路线是一个元组列表,其中第一项是地理坐标。

我该如何解决这个问题?

您在结果准备好之前从 GetStreetName 返回,因为 query.QueryAsync(); 刚刚开始查询,并没有等待它完成。

最重要的是,您将所有结果写入同一个全局 streetname

您需要使用 TaskCompletionSource

尝试这样的事情:

private async Task<string> GetStreetNameAsync(int i)
{
    var tcs = new TaskCompletionSource<IEnumerable<string>>();

    EventHandler<QueryCompletedEventArgs<IList<MapLocation>>> handler = (s, e) =>
        {
            if (e.Error != null)
            {
                tcs.TrySetException(e.Error);
                return;
            }

            if (e.Cancelled)
            {
                tcs.TrySetCanceled();
                return;
            }

            tcs.TrySetResult(e.Result[0].Information.Address.Street);
        };

    var query = new ReverseGeocodeQuery();
    query.GeoCoordinate = Route[i].Item1;

    try
    {
        query.QueryCompleted += handler;

        query.QueryAsync();

        return await tcs.Task;
    }
    finally
    {
        query.QueryCompleted -= handler;
    }
}