Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin重试失败的数据请求_C#_Xamarin_Xamarin.ios_Xamarin.android_Task Parallel Library - Fatal编程技术网

C# Xamarin重试失败的数据请求

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

我正在构建一个Xamarin iOS&android应用程序,我想对所有失败的webcall实现重试功能,或者在断开连接的情况下,我已经在BLL端使用Polly,我想让用户可以手动重试,如上图所示

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();
    }
}