-2

我在 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 时,我通常会以无休止的等待而没有完成任何任务。

我想知道如何通过地址列表同步循环上述方法(让每个新任务只在旧任务完成时运行),然后在所有异步任务完成时运行一个方法。如果异步任务在找到结果地址时停止,那也很好。

帮助将不胜感激!

4

1 回答 1

0

改变

public async void searchSubjectAddress(string sAddress)

  public async Task searchSubjectAddress(string sAddress)

然后无论什么调用 searchSubjectAddress 都可以等待这个调用,所以你知道它什么时候完成。您也可以考虑让它返回 Task < SearchResult> ,这样您就可以将地址发送回调用者。通常,当您编写“async void”时,您是在为自己设置问题,因此请尝试始终使用“async Task”或“async Task<T>”来代替。

附带说明:v10.x 版本早已被弃用/不受支持,您真的应该迁移到 v100.8

于 2020-07-30T20:16:33.537 回答