【问题标题】:Network Activity Spinner Spins Forever网络活动微调器永远旋转
【发布时间】:2017-04-15 04:19:51
【问题描述】:

我正在构建一个 Xamarin Forms 应用程序,但在状态栏 (iOS) 中的网络活动微调器一直持续旋转时出现问题。下面是我用来显示加载屏幕的代码。

private async Task ExecuteConfigureCampaignCommand()
    {
        if (IsBusy)
        {
            return;
        }

        IsBusy = true;
        //ConfigureCampaignCommand.ChangeCanExecute();
        bool showAlert = false;
        string campaign = null;

        try
        {
            campaign = CrossSecureStorage.Current.GetValue(SettingNames.Campaign);

            if (!String.IsNullOrEmpty(campaign))
            {
                StatusMessage = "Blah";
                OnPropertyChanged("StatusMessage");

                await Task.Delay(1000);

                StatusMessage = "Blah";
                OnPropertyChanged("StatusMessage");

                await Task.Delay(700);

                StatusMessage = "Blah";
                OnPropertyChanged("StatusMessage");

                await Task.Delay(500);

                MessagingService.Current.SendMessage<string>(SettingNames.NavigationSales, campaign);
            }
        }
        catch (Exception e)
        {
            var abc = e;
            showAlert = true;
        }
        finally
        {
            IsBusy = false;
            //ConfigureCampaignCommand.ChangeCanExecute();
        }

        if (showAlert)
        {
            await page.DisplayAlert("Uh Oh :(", "Unable to load campaign.", "OK");
        }
    }

这是从命令中调用的:

public Command ConfigureCampaignCommand
    {
        get
        {
            return configureCampaignCommand ?? (configureCampaignCommand = new Command(async () => await ExecuteConfigureCampaignCommand(), () => { return !IsBusy; }));
        }
    }

从 OnAppearing 调用:

protected override void OnAppearing()
    {
        base.OnAppearing();

        viewModel.ConfigureCampaignCommand.Execute(null);
    }

逻辑很好 - 我期望的视图已加载,但网络活动微调器继续旋转。如果我添加 1 秒延迟:

                Device.StartTimer(TimeSpan.FromMilliseconds(1), () =>
                {
                    MessagingService.Current.SendMessage<string>(SettingNames.NavigationSales, campaign);

                    return false;
                });

加载新视图后,微调器停止。如果我删除 await Task.Delay 的,一旦加载视图,微调器就会停止,但是加载消息对用户不可见。

我的问题是,为什么网络微调器会继续?

【问题讨论】:

    标签: c# xamarin.forms async-await


    【解决方案1】:

    每当您更改 IsBusy 时

     OnPropertyChanged("IsBusy");
    

    当您为其他属性而不是为 IsBusy 调用它时,我想这可能是更改没有被采纳的原因。

    【讨论】:

    • 我正在使用一个 MVVM Helper 库,它定义 IsBusy 并调用 OnPropertyChange("IsBusy")
    • ExecuteConfigureCampaignCommand 是否在 UI 线程上调度?
    • 我假设我们正在谈论这个属性developer.xamarin.com/api/property/Xamarin.Forms.Page.IsBusy
    • 它在 UI 线程上执行 - 起初我认为 await Task.Delay 将其推送到后台线程,但事实并非如此
    • 除非您告诉它不要,否则没有等待将始终返回到前一个调度程序/线程。您将不得不在任务池或其他东西上启动任务。但这似乎不是问题。
    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多