UI 在 xamarin 表单的刷新 ListView 期间被阻止
The UI is blocked during refresh ListView for xamarin form
为什么当我使用 async
请求从服务器加载数据时 UI 被阻止,如下所示:
public ObservableCollection<VideoFile> VideoFiles { get; private set; } = new ObservableCollection<VideoFile>();
private void LoadVideoFiles(string categoryId = "*", int page = 1)
{
_videoFiles = NotifyTask.Create(_videoManager.GetVideoFilesAsync(_videoFileSearchParam));
_videoFiles.PropertyChanged -= VideoFilesPropertyChanged;
_videoFiles.PropertyChanged += VideoFilesPropertyChanged;
}
private void VideoFilesPropertyChanged(object sender, PropertyChangedEventArgs propertyName)
{
foreach (var videoFile in ((NotifyTask<List<VideoFile>>)sender).Result)
{
VideoFiles.Add(videoFile);
}
}
UI 被阻止,因为您正在进行的调用是同步的,因此应用程序将等待整个线程,直到此调用结束。
如果你想让 UI 同时响应,你应该使用 async
关键字使方法异步。
这样它将让方法 运行,而所有其他 UI 元素将保持响应。你可以阅读更多here
为什么当我使用 async
请求从服务器加载数据时 UI 被阻止,如下所示:
public ObservableCollection<VideoFile> VideoFiles { get; private set; } = new ObservableCollection<VideoFile>();
private void LoadVideoFiles(string categoryId = "*", int page = 1)
{
_videoFiles = NotifyTask.Create(_videoManager.GetVideoFilesAsync(_videoFileSearchParam));
_videoFiles.PropertyChanged -= VideoFilesPropertyChanged;
_videoFiles.PropertyChanged += VideoFilesPropertyChanged;
}
private void VideoFilesPropertyChanged(object sender, PropertyChangedEventArgs propertyName)
{
foreach (var videoFile in ((NotifyTask<List<VideoFile>>)sender).Result)
{
VideoFiles.Add(videoFile);
}
}
UI 被阻止,因为您正在进行的调用是同步的,因此应用程序将等待整个线程,直到此调用结束。
如果你想让 UI 同时响应,你应该使用 async
关键字使方法异步。
这样它将让方法 运行,而所有其他 UI 元素将保持响应。你可以阅读更多here