C# Xamarin重试失败的数据请求
我正在构建一个Xamarin iOS&android应用程序,我想对所有失败的webcall实现重试功能,或者在断开连接的情况下,我已经在BLL端使用Polly,我想让用户可以手动重试,如上图所示C# Xamarin重试失败的数据请求,c#,xamarin,xamarin.ios,xamarin.android,task-parallel-library,C#,Xamarin,Xamarin.ios,Xamarin.android,Task Parallel Library,我正在构建一个Xamarin iOS&android应用程序,我想对所有失败的webcall实现重试功能,或者在断开连接的情况下,我已经在BLL端使用Polly,我想让用户可以手动重试,如上图所示 protected List<Task> _taskList; _taskList.Add(Task.Run(async () => { try { **// Webservice Call** Task<Utilisateur
protected List<Task> _taskList;
_taskList.Add(Task.Run(async () =>
{
try
{
**// Webservice Call**
Task<UtilisateurDTO> utilisateurTask = UserFactory.Login(username, pwd,
App.Hardware.GetDeviceId());
UtilisateurDTO utilisateur = await utilisateurTask;
if (utilisateur != null)
{
InvokeOnMainThread(() =>
{
**// Set result to ui component**
});
}
}
catch (Exception ex)
{
InvokeOnMainThread(() =>
{
// Add action button "Retry" to snackBar
_snackBar = new TTGSnackbar("ex.Message", TTGSnackbarDuration.Forever, "Retry", (obj) => {
// **Retry all tasks**
Parallel.ForEach(_taskList, task => task.Start());
});
_snackBar.Show();
});
}
}));
//其他ViewController
public partial class HomeController : BaseViewController
{
public override void ViewDidLoad()
{
base.ViewDidLoad();
LoadData();
}
public void LoadData(){
Task.Run(async () =>
{
try
{
// Web calls
Task<UtilisateurDTO> getUserTask = AccueilFactory.GetUser();
UtilisateurDTO utilisateur = await getUserTask;
// Set UI result
}
catch(Exception ex) {
HandleExceptions(ex);
}
}
}
protected override void ReloadData(TTGSnackbar obj)
{
LoadData();
}
}
公共部分类HomeController:BaseViewController
{
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
LoadData();
}
公共void LoadData(){
Task.Run(异步()=>
{
尝试
{
//网络电话
Task getUserTask=AccueilFactory.GetUser();
UtisateUrdto Utisateur=等待getUserTask;
//设置用户界面结果
}
捕获(例外情况除外){
手部异常(ex);
}
}
}
受保护覆盖无效重载数据(TTGSnackbar obj)
{
LoadData();
}
}
您必须在异常时再次调用函数,而不仅仅是重新运行上一个任务
您的代码如下所示:
私有void登录()
{
尝试
{
LoginInner();//这里调用服务和更新UI
}
捕获(例外情况除外)
{
InvokeOnMainThread(()=>
{
//将操作按钮“重试”添加到snackBar
_snackBar=newttgsnackbar(“ex.Message”,TTGSnackbarDuration.Forever,“Retry”,(obj)=>{
//**重试所有任务**
Parallel.ForEach(_taskList,LoginInner);//**再次调用LoginInner**
});
_snackBar.Show();
});
}
}
为什么要在异常中再次运行所有任务,为什么不只是再次运行故障任务?这不是问题,即使我只想运行一个故障任务,task.Start()也会出现异常,因为您无法再次运行已完成的任务。是的。但是如果您知道哪些任务失败,您可以重新创建它。在您的情况下,请使用UserFactory.Login(username,pwd,App.Hardware.GetDeviceId())
但我认为您想在这里调用您的函数。不仅要运行任务。如果您有在UI中设置结果的代码,您不想重新编写它。谢谢,我将尝试用适当的代码更新主题
public partial class HomeController : BaseViewController
{
public override void ViewDidLoad()
{
base.ViewDidLoad();
LoadData();
}
public void LoadData(){
Task.Run(async () =>
{
try
{
// Web calls
Task<UtilisateurDTO> getUserTask = AccueilFactory.GetUser();
UtilisateurDTO utilisateur = await getUserTask;
// Set UI result
}
catch(Exception ex) {
HandleExceptions(ex);
}
}
}
protected override void ReloadData(TTGSnackbar obj)
{
LoadData();
}
}