【问题标题】:Windows Phone 8 - Getting Multiple Street NamesWindows Phone 8 - 获取多个街道名称
【发布时间】:2016-11-30 21:03:23
【问题描述】:

我为 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 运算符正在等待异步方法完成)。

附加信息:我刚刚看到在这个简短的 sn-p 中这不是 100% 清楚的,街道名称和路线是全局“变量”,路线是一个元组列表,其中第一项是地理坐标。

我该如何解决这个问题?

【问题讨论】:

    标签: silverlight windows-phone-8 async-await maps


    【解决方案1】:

    您在结果准备好之前从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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多