首页 > 解决方案 > 在 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");
    }

标签: xamarinxamarin.forms

解决方案


在这种特殊情况下, await Task.Yield没有任何用处。处理 Win32 消息(如WM_PAINT. 即,一个“穷人的DoEvents”。

await Task.Yield用于强制异步。这是一种强制await异步行为的方式,返回给调用者。它还立即将要运行的方法的其余部分排队。

这不能作为“穷人DoEvents”工作的原因是 Win32 消息队列具有优先级。所以这就是await Task.Yield在这个特定实例中实际执行的操作:

  • 将方法的延续排队async到当前上下文( UI SynchronizationContext),这会将延续放入 Win32 消息队列。
  • async方法返回。由于这是一个事件处理程序,因此返回到 Win32 消息处理循环。
  • Win32 消息处理循环从其队列中拉出下一条消息。由于队列有优先级,它总是会跳过常规的 Win32 消息并获取继续消息。
  • 循环处理消息,该消息运行async方法的延续,因此事件处理程序从中断的地方继续执行。

推荐阅读