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

Silverlight Windows Phone 8-获取多个街道名称,silverlight,windows-phone-8,async-await,maps,Silverlight,Windows Phone 8,Async Await,Maps,我为WindowsPhone8.0Silverlight应用程序创建了一个异步方法GetStreetName string streetname; private async Task<string> GetStreetName(int i) { MapAddress address; ReverseGeocodeQuery query = new ReverseGeocodeQuery(); query.GeoCoordinate = Route[i].I

我为WindowsPhone8.0Silverlight应用程序创建了一个异步方法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;
}
字符串streetname;
专用异步任务GetStreetName(int i)
{
地图地址;
ReverseGeocodeQuery=新建ReverseGeocodeQuery();
query.geocordinate=Route[i].Item1;
query.QueryCompleted+=(s,e)=>
{
如果(例如错误!=null)
返回;
address=e.Result[0]。Information.address;
街道名称=地址。街道;
};
query.QueryAsync();
返回街道名称;
}
我在for循环中使用wait操作符调用它:

for (int i = 0; i < Route.Count; i++)
{
       ListBox.Items.Add(await GetStreetName(i));
}
for(int i=0;i
但是我总是只得到第一次加载的地理位置的街道名称,我不知道为什么(我以为等待操作符正在等待异步方法完成)

附加信息:我刚刚看到,在这个简短的片段中,这不是100%清楚的,streetname和Route是全局“变量”,Route是一个元组列表,其中第一项是地理坐标


如何解决此问题?

在结果准备就绪之前,您将从
GetStreetName
返回becayse
query.querysync()只启动查询,不等待查询完成

最重要的是,您正在将所有结果写入相同的全局
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;
    }
}
专用异步任务GetStreetNameAsync(int i)
{
var tcs=new TaskCompletionSource();
EventHandler=(s,e)=>
{
如果(例如错误!=null)
{
tcs.TrySetException(即错误);
返回;
}
如果(如已取消)
{
tcs.trysetconceled();
返回;
}
tcs.TrySetResult(e.Result[0].Information.Address.Street);
};
var query=new ReverseGeocodeQuery();
query.geocordinate=Route[i].Item1;
尝试
{
query.QueryCompleted+=处理程序;
query.QueryAsync();
返回等待任务;
}
最后
{
query.QueryCompleted-=处理程序;
}
}

在结果准备就绪之前,您将从
GetStreetName
返回becayse
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;
    }
}
专用异步任务GetStreetNameAsync(int i)
{
var tcs=new TaskCompletionSource();
EventHandler=(s,e)=>
{
如果(例如错误!=null)
{
tcs.TrySetException(即错误);
返回;
}
如果(如已取消)
{
tcs.trysetconceled();
返回;
}
tcs.TrySetResult(e.Result[0].Information.Address.Street);
};
var query=new ReverseGeocodeQuery();
query.geocordinate=Route[i].Item1;
尝试
{
query.QueryCompleted+=处理程序;
query.QueryAsync();
返回等待任务;
}
最后
{
query.QueryCompleted-=处理程序;
}
}