При тестировании приложения 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());
Последний подход не застревает поток пользовательского интерфейса , но если я запускаю его более одного раза, запрос не возвращается, даже после истечения времени ожидания. Более того, в этот момент, если я сделаю другой запрос, не используя новый поток, он застрянет в потоке пользовательского интерфейса.
Кто-нибудь знает, как его решить, или лучше подойдет к этой проблеме? Обратите внимание, что это происходит только при значительной потере пакетов.