Ожидание MapLocationFinder.FindLocationsAtAsync никогда не заканчивается - PullRequest
0 голосов
/ 20 декабря 2018

В ожидании MapLocationFinder моя программа по-прежнему работает, даже после попытки закрыть ее с помощью Application.Current.Shutdown () ;.Я новичок.

Я уже пытался использовать CancellationToken или запустить это как Task.Но я не знаю, правильно ли я это сделал.Я несколько часов пробовал разные мысли, но у меня ничего не получалось.

private async Task GetLocation()
    {
        var accesStatus = await Geolocator.RequestAccessAsync();
        switch (accesStatus)
        {
            case GeolocationAccessStatus.Allowed:
                // locate user
                var locator = new Windows.Devices.Geolocation.Geolocator();
                var location = await locator.GetGeopositionAsync();
                var position = location.Coordinate.Point.Position;

                // get city name
                Geopoint geopoint = new Geopoint(new BasicGeoposition
                {
                    Latitude = position.Latitude,
                    Longitude = position.Longitude
                });

Здесь начинается проблема

                MapLocationFinderResult result = await MapLocationFinder.FindLocationsAtAsync(geopoint, MapLocationDesiredAccuracy.Low);

                if (result.Status == MapLocationFinderStatus.Success)
                {
                    locationBlock.Text = "City: " + result.Locations[0].Address.Town;
                }

проблема закончилась, остальноепросто для контекста

                // calculate time
                int[] sun = SunDate.CalculateSunriseSunset(51.434406, 6.762329);
                var sunrise = new DateTime(1, 1, 1, sun[0] / 60, sun[0] - (sun[0] / 60) * 60, 0);
                var sunset = new DateTime(1, 1, 1, sun[1] / 60, sun[1] - (sun[1] / 60) * 60, 0);

                //fit UI
                lightStartBox.Text = sunrise.Hour.ToString();
                darkStartBox.Text = sunset.Hour.ToString();

                // apply settings
                lightStartBox.IsEnabled = false;
                darkStartBox.IsEnabled = false;
                break;

            case GeolocationAccessStatus.Denied:
                locationCheckBox.IsChecked = false;
                locationBlock.Text = "The App needs permission to location";
                await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));
                break;

            case GeolocationAccessStatus.Unspecified:
                locationCheckBox.IsChecked = false;
                locationBlock.Text = "The App needs permission to location";
                await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));
                break;
        }
        return;
    }

Если я закрою программу, она также должна завершить задачу ожидания.Лучше: операция должна закончиться после того, как он получит информацию.

1 Ответ

0 голосов
/ 21 декабря 2018

Если я закрою программу, она также должна завершить задачу ожидания.Лучше: он должен завершить операцию после того, как он получил информацию.

Я запустил ваш код, но не смог воспроизвести проблему, я мог получить MapLocationFinderResult с небольшой задержкой.Я обнаружил, что вы использовали MapLocationDesiredAccuracy.Low параметр.И он будет использовать дисковый кеш карт для получения точной информации до уровня города.карта кеш диска может вызвать эту проблему.Вы можете попробовать использовать параметр MapLocationDesiredAccuracy.High.

Как видите, FindLocationsAtAsync - это IAsyncOperation метод.Таким образом, вы можете отменить его вручную или установить токен отмены тайм-аута.

Например

private IAsyncOperation<string> GetAsyncOperation()
{
    return AsyncInfo.Run<string>(
       (token) => // CancellationToken token
           Task.Run<string>(
               () =>
               {
                   token.WaitHandle.WaitOne(3000);
                   token.ThrowIfCancellationRequested();     
                   return "hello";
               },
               token));
}

private IAsyncOperation<string> operation;

private async void Button_Click(object sender, RoutedEventArgs e)
{
    try
    {
        operation = GetAsyncOperation();
        var res = await operation;
    }
    catch (Exception)
    {

        System.Diagnostics.Debug.WriteLine("method end");
    }

}
private void Cancel_Button_Click(object sender, RoutedEventArgs e)
{
    operation?.Cancel();
}

Заданное время ожидания

private async void Button_Click(object sender, RoutedEventArgs e)
{
  var source = new CancellationTokenSource(4000);
  var res = await GetAsyncOperation().AsTask(source.Token);
}
...