Я использую C# HttpClient для отправки HTTP-вызова в моих приложениях Xamarin. iOS. Но когда я отправляю свое приложение в фоновый режим или даже когда отправляется вызов, я открываю центр управления или центр уведомлений, мое приложение вылетает, выдает OperationCanceledException. Я использую делегатов в качестве обратных вызовов в этих вызовах, когда получаю ответ от сервера. Есть ли способ, чтобы остановить мое приложение от сбоя. Вот следующий пример моего кода:
public async void LoginVerify(APIDelegate<Response<bool>> callback)
{
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(IP);
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("login_code", Login_Code),
});
CancellationTokenSource cts = new CancellationTokenSource(TimeSpan.FromSeconds(TimeOutTime));
var result = await client.PostAsync("/dev", content, cts.Token);
string resultContent = await result.Content.ReadAsStringAsync();
Response<bool> response = JsonConvert.DeserializeObject<Response<bool>>(resultContent);
callback(response);
}
}
catch (OperationCanceledException ex)
{
callback(new Response<bool> { ErrorMsg = Params.NoInternet_error, Message = Params.NoInternet_error, Data = false, StatusCode = int.Parse(Params.NoInternet_code) });
}
catch (JsonSerializationException ex)
{
callback(new Response<bool> { ErrorMsg = Params.Main_error, Message = Params.JsonDeserialize_error + " in LoginVerify Function", Data = false, StatusCode = int.Parse(Params.JsonDeserialize_error_code) });
}
catch (Exception ex)
{
callback(new Response<bool> { ErrorMsg = Params.Main_error, Message = ex.Message + " :: " + ex.StackTrace +" in LoginVerify Function", Data = false, StatusCode = int.Parse(Params.AppInternalIssue_code) });
}
}
После получения ответа я использую своего делегата следующим образом:
void Login(string ntlogin)
{
try
{
if (!CheckInternetConnection())
{
NoInternetError();
}
else
{
if (toast != null)
toast.Dismiss();
API.Login_Code = code_first.Text + code_second.Text + code_third.Text + code_fourth.Text;
API.LoginVerify((responseVerify) =>
{
if (responseVerify != null)
{
if (responseVerify.StatusCode == 200)
{
if (responseVerify.Data)
{
API.Data((response) =>
{
_timer.Stop();
//If No Exception Is Thrown
if (response != null)
{
if (response.StatusCode == 200 || response.StatusCode == 202)
{
tab. = response.Data;
//del.Window.RootViewController = nav;
UIView.Transition(del.Window, 0.5, UIViewAnimationOptions.TransitionFlipFromRight, () =>
{
del.Window.RootViewController = tab;
}, null);
}
else
{
ErrorLog(response.Message, response.Message + " Error while fetching details on SplashController.", Params.AppInternalIssue_code);
}
}
else
{
ErrorLog(Params.Main_error, " Details returned null on Splash Controller.", Params.AppInternalIssue_code);
}
});
}
}
}
else
{
loadPop.Hide();
ErrorLog(Params.Main_error, responseVerify.Message, Params.AppInternalIssue_code);
}
});
}
}
catch (Exception ex)
{
ErrorLog(Params.Main_error, ex.Message + " :: " + ex.StackTrace + " :: LoginSMSController func Login", Params.AppInternalIssue_code);
}
}