我在 C# 中使用arcGIS SDK来搜索地址。我想做的是搜索多个地址,然后在找到所有地址后执行一个方法。这很可能通过使用循环来实现。
这是在地图上查找地址的代码:
public async void searchSubjectAddress(string sAddress)
{
var uri = new Uri("http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer");
var token = string.Empty;
var locator = new OnlineLocatorTask(uri, token);
var info = await locator.GetInfoAsync();
var singleAddressFieldName = info.SingleLineAddressField.FieldName;
var address = new Dictionary<string, string>();
address.Add(singleAddressFieldName, sAddress);
var candidateFields = new List<string> { "Score", "Addr_type", "Match_addr", "Side" };
var task = locator.GeocodeAsync(address, candidateFields, MyMapView.SpatialReference, new CancellationToken());
IList<LocatorGeocodeResult> results = null;
try
{
results = await task;
if (results.Count > 0)
{
var firstMatch = results[0];
var matchLocation = firstMatch.Location as MapPoint;
Console.WriteLine($"Found point: {matchLocation.ToString()}");
MyMapView.SetView(matchLocation);
}
}
catch (Exception ex)
{
Console.WriteLine("Could not find point");
var msg = $"Exception from geocode: {ex.Message} At address: {sAddress}";
Console.WriteLine(msg);
}
}
我目前正在关注本教程: https ://developers.arcgis.com/net/10-2/desktop/guide/search-for-places.htm
我可以找到一个地址,但是异步任务有点混乱。代码必须与异步任务一起执行才能运行,所以我无法更改。
在一个例子中使用它:我想获得一个属性和其他几个属性之间的距离。我只能访问街道地址,所以我使用上面的代码来查找地址并获取地理坐标。然后我将这些坐标保存在列表中以备后用。
我的问题是,当我想执行后面的方法时,异步任务仍在运行,我的程序执行后面的方法,而不管异步方法是否完成。当我将方法更改为 Task 类型而不是 void 时,我通常会以无休止的等待而没有完成任何任务。
我想知道如何通过地址列表同步循环上述方法(让每个新任务只在旧任务完成时运行),然后在所有异步任务完成时运行一个方法。如果异步任务在找到结果地址时停止,那也很好。
帮助将不胜感激!