当Xamarin形式出现时,等待任务.屈服点做什么?

当Xamarin形式出现时,等待任务.屈服点做什么?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我的OnAppearing代码如下所示。我不明白这是为了什么: `await Task.Yield()` 有人能解释一下这是怎么回事吗 protected override async void OnAppearing() { base.OnAppearing(); Utils.SetState(Settings.mode.Text(), vm.Mode); vm.CfsLabel = Settings.cfs.Text();

我的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");
    }

我认为,当你读到微软的文档时,微软的文档会让你清楚地了解它的功能:

创建一个等待的任务,该任务在等待时异步返回到当前上下文

返回 可接受的

在等待时,将在等待时异步转换回当前上下文的上下文。如果当前SynchronizationContext为非null,则将其视为当前上下文。否则,与当前执行的任务关联的任务计划程序将被视为当前上下文

这基本上意味着,在异步方法中使用wait Task.Yield时,它将强制该方法异步完成。如果有可用的方法,它将执行方法执行的剩余部分返回到该上下文

注意:在大多数UI环境中,UI线程上存在的同步上下文通常会将发布到上下文的工作优先于输入和呈现工作。因此,不要依赖等待任务。屈服;保持用户界面的响应性

在这种情况下,等待任务。Yield没有任何用处。处理像WM_PAINT这样的Win32消息可能是错误的尝试。也就是说,一个穷人的行为

等待任务。屈服习惯于。这是一种强制wait异步运行的方式,返回给调用者。它还立即将要运行的方法的其余部分排队

作为穷人的DoEvents,这不起作用的原因是Win32消息队列具有优先级。这就是wait Task.Yield在这个特定实例中的实际作用:

将异步方法的延续排队到当前上下文UI SynchronizationContext,该上下文将延续放入Win32消息队列。 从异步方法返回。由于这是一个事件处理程序,因此将返回Win32消息处理循环。 Win32消息处理循环从其队列中提取下一条消息。由于队列具有优先级,因此它将始终跳过常规Win32消息并接受延续消息。 循环处理消息,该消息运行异步方法的延续,因此事件处理程序将在停止的位置继续执行。 可能重复的