首页 > 解决方案 > Xamarin 选项卡式表单应用程序模板:微调器不停止,异步任务无效

问题描述

更新:这不会发生在 Android 设备或 Android 模拟器上;这是 iOS 设备和 iOS 模拟器特定的错误。

我在 Mac 上运行一个开箱即用的模板。要测试自己,您可以简单地转到 Visual Studio:

  1. 文件
  2. 新解决方案
  3. 多平台:应用程序
  4. 选项卡式表单应用程序

在 iPhone 设备或 iPhone 模拟器上运行时,列表顶部的微调器不会停止旋转。我怀疑这是由于共享表单项目中的这段代码:

public class ItemsViewModel : BaseViewModel
    {
        public ObservableCollection<Item> Items { get; set; }
        public Command LoadItemsCommand { get; set; }

        public ItemsViewModel()
        {
            Title = "Browse";
            Items = new ObservableCollection<Item>();
            LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand());

            MessagingCenter.Subscribe<NewItemPage, Item>(this, "AddItem", async (obj, item) =>
            {
                var newItem = item as Item;
                Items.Add(newItem);
                await DataStore.AddItemAsync(newItem);
            });
        }

        async Task ExecuteLoadItemsCommand()
        {
            if (IsBusy)
                return;

            IsBusy = true;

            try
            {
                Items.Clear();
                var items = await DataStore.GetItemsAsync(true);
                foreach (var item in items)
                {
                    Items.Add(item);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                IsBusy = false;
            }
        }
    }

具体来说,LoadItemsCommand = new Command(async () => await ExecuteLoadItemCommand())与方法签名一起将其视为async Task<void>.

我虽然将 Tasks 调用为 void 是一个很大的禁忌,因为除其他原因外,CLR 状态机不能对任务的结果做任何事情?此外,某些代表(值得注意)正在监视的此任务更改的任何内容IsBusy都不会受到影响?

BaseViewModel.cs

public class BaseViewModel : INotifyPropertyChanged
{
    public IDataStore<Item> DataStore => DependencyService.Get<IDataStore<Item>>();

    bool isBusy = false;
    public bool IsBusy
    {
        get { return isBusy; }
        set { SetProperty(ref isBusy, value); }
    }
 ...
}

从视图中,特别是微调控件ItemsPage.xaml

IsRefreshing="{Binding IsBusy, Mode=OneWay}"

MacOS: 10.15.2, Visual Studio for Mac: 8.3.10(Build 2), Xcode: 11.3(11C29), iOS 模拟器: 11.3(SimulatorApp-912.5 SimulatorKit-570.3 CoreSimulator-681.17)

标签: c#xamarinasynchronoustaskvoid

解决方案


在 Forms 和 iOS 项目中更新以下内容后,

  • Xamarin.Forms (4.2.0.709249) -> (4.4.0.991265)
  • Xamarin.Essentials (1.2.0) -> (1.3.1)

加载列表后,微调器现在停止旋转。应该注意的是,在创建这些项目时,尽管 Visual Studio 是最新的,但它选择使用过时的 NuGet 包创建所述项目。


推荐阅读