Использование RestSharp на iOS со 100% потерей пакетов - PullRequest
1 голос
/ 29 февраля 2020

При тестировании приложения iOS я использовал настройки разработчика, чтобы установить для устройства iPhone 100% -ную потерю, и использовал метод для получения некоторых данных с сервера.

(тот же сценарий также может быть смоделирован при подключении к Wi-Fi без подключения inte rnet).

Я предполагал, что я не получу никаких данных и получу тайм-аут. Проблема в том, что я получаю тайм-аут для первой попытки, но если я пытаюсь выполнить запрос снова (например, с помощью UIRefreshControl), все приложение зависает (застревает поток пользовательского интерфейса), а затем уничтожается ОС .

Это пример исходного кода, который я использовал:

var client = new RestClient();
client.BaseUrl = new Uri("some_url");
client.Timeout = 20000;

client.ExecuteAsync(request, response =>
{
   //Doing some stuff
});    

После некоторых исследований я изменил код и попробовал несколько разных подходов:

 private static async void getUserDataFromServer()
 {  
         var client = new RestClient();
         client.Timeout = 20000;
         var request = new RestRequest("http://www.google.com");
         var cancellationTokenSource = new CancellationTokenSource();

         var restResponse =
             await client.ExecuteAsync(request, cancellationTokenSource.Token);
         Console.WriteLine(restResponse.Content);
 }

Это также ведет себя так же.

Затем я попытался явно запустить его в другом потоке:

 Task.Factory.StartNew(() => getUserDataFromServer());

Последний подход не застревает поток пользовательского интерфейса , но если я запускаю его более одного раза, запрос не возвращается, даже после истечения времени ожидания. Более того, в этот момент, если я сделаю другой запрос, не используя новый поток, он застрянет в потоке пользовательского интерфейса.

Кто-нибудь знает, как его решить, или лучше подойдет к этой проблеме? Обратите внимание, что это происходит только при значительной потере пакетов.

...