@yungarium

Почему падает приложение Xamarin.iOS при отключении сети?

Использую WebClient в Xamarin.iOS. Надо постоянно подгружать файл по ссылке и передавать скачанное в TextField, все отлично получилось. Однако при отключении сети иногда вылетает System.Reflection.TargetInvocationException(хотя я и отлавливаю его) и вылетает именно во время работы, не в начале. Оно вылетает по непонятной мне логике "раз через раз", назовем это так. Код дебажил, понял ГДЕ проблема, но не понимаю В ЧЕМ она заключается и КАК ее исправить.

1. Отключаю сеть wi-fi на телефоне. Программа сразу обращается к этому действию
CrossConnectivity.Current.ConnectivityChanged += (sender, args) =>
            {
                try
                {
                    if (CrossConnectivity.Current.IsConnected)
                    {
                        timer.Elapsed += Timer_Elapsed;
                        timer.Start();
                        alertnetworkerror.DismissViewController(true,null);
                    }
                    else
                    {
                        timer.Stop();
                        throw new Exception();
                    }
                }
                catch (Exception)
                {
                    ShowViewController(alertnetworkerror, null);
                    ContainerTextPrice1.Text = "";
                    ContainerTextPrice2.Text = "";
                }
            };


2. Внутри вызывается метод: timer.Elapsed += Timer_Elapsed И ВОТ КАК РАЗ ТУТ "раз через раз" выкидывается необработанный эксепшн, приложение просто падает
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            DateTime myDate = DateTime.Now;
            InvokeOnMainThread(() =>
            {
                var webClient = new WebClient();
                var url = new Uri("https://blockchain.info/tobtc?currency=USD&value=1");
                webClient.Encoding = Encoding.UTF8;
 
                webClient.DownloadStringCompleted += (s, es) =>
                {
                    var text = es.Result; //  get the downloaded text
                    string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
                    string localFilename = "downloaded.txt";
                    string localPath = Path.Combine(documentsPath, localFilename);
                    File.WriteAllText(localPath, text); // writes to local storage
 
                    Decimal.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal x);
 
                    InvokeOnMainThread(() =>
                    {
                        ContainerTextPrice2.Text = text;
                        ContainerTextPrice1.Text = (1 / x).ToString("#.##");
                    });
                };
 
                webClient.DownloadStringAsync(url);
            });
        }


Заранее спасибо!
  • Вопрос задан
  • 102 просмотра
Пригласить эксперта
Ответы на вопрос 1
newross
@newross
Product owner
Приложение падает, потому что в методе Timer_Elapsed нет никакой обработки ошибок. Код, который срабатывает по CrossConnectivity.Current.ConnectivityChanged всего лишь запускает таймер, не более.
Чтобы исключить такие проблемы, рекомендую перейти на RestEase вместо WebClient, с ним гораздно удобней работать. И вместо таймера использовать Polly, есть куча примеров как сделать красивый error handling с заданными количеством повторений запросов в случае сбоев.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы