xamarin - 在 Xamarin Forms OnAppearing 中,await Task.Yield 有什么作用?
问题描述
我的 OnAppearing 代码如下所示。我不明白这是为了什么而添加的:
`await Task.Yield()`
有人可以解释这是做什么的吗?
protected override async void OnAppearing()
{
base.OnAppearing();
Utils.SetState(Settings.mode.Text(), vm.Mode);
vm.CfsLabel = Settings.cfs.Text();
SetMode(Settings.mode.Text());
Subscribe();
ContentPageStack.IsVisible = true;
if (!openedOnce)
{
// can someone explain what the following line
// is doing here in the code. What's the Task
// that it refers to and what does Yield do?
await Task.Yield();
await scroll.ScrollToAsync(0, 0, false);
openedOnce = true;
}
if (App.devIsUser)
Analytics.TrackEvent(VersionTracking.CurrentVersion + " - On Appearing - home page");
}
解决方案
在这种特殊情况下, await Task.Yield
没有任何用处。处理 Win32 消息(如WM_PAINT
. 即,一个“穷人的DoEvents
”。
await Task.Yield
用于强制异步。这是一种强制await
异步行为的方式,返回给调用者。它还立即将要运行的方法的其余部分排队。
这不能作为“穷人DoEvents
”工作的原因是 Win32 消息队列具有优先级。所以这就是await Task.Yield
在这个特定实例中实际执行的操作:
- 将方法的延续排队
async
到当前上下文( UISynchronizationContext
),这会将延续放入 Win32 消息队列。 - 从
async
方法返回。由于这是一个事件处理程序,因此返回到 Win32 消息处理循环。 - Win32 消息处理循环从其队列中拉出下一条消息。由于队列有优先级,它总是会跳过常规的 Win32 消息并获取继续消息。
- 循环处理消息,该消息运行
async
方法的延续,因此事件处理程序从中断的地方继续执行。
推荐阅读
- php - 使用数组数据格式化 Excel Laravel
- python - 为什么这个 SQL INSERT INTO 语句会抛出错误:TypeError: not all arguments convert during string formatting
- ios - currentContext 表示样式改变子视图控制器视图的大小
- mysql - 无法使用 java.util.UUID 从主键为二进制 (128) 的 Mysql db 检索数据
- firebase - Firebase 即时用户禁用?
- calayer - 通过 AVAssetExportSession 导出时,CABasicAnimation 不更新自定义 CALayer 属性
- scala - Scala Recursive For Comprehension 只在空列表前面添加一次,为什么?
- ios - 在 SwiftUI 表单中有多个列
- ios - Flutter 应用程序是否支持 Microsoft Intune App SDK?
- opencv - 没有规则使目标'-L/usr/local/lib'