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;
}
}
我为 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;
}
}