Xamarin,等待异步函数结束

Xamarin,等待异步函数结束,xamarin,async-await,Xamarin,Async Await,在主文件主页面中,我有一个方法OnAppearing包含两个函数 MainPage.cs protected override void OnAppearing() { DataBaseService.checkNoteAlarmTimeActive(); this.loadNotes(); base.OnAppearing(); } 不幸的是

在主文件主页面中,我有一个方法OnAppearing包含两个函数

MainPage.cs

 protected override void OnAppearing()
        {
            DataBaseService.checkNoteAlarmTimeActive();
            this.loadNotes();                       
            base.OnAppearing();
        }
不幸的是,方法loadNotes()是在方法DataBaseService.checkNoteAlarmTimeActive()之前激发的;末端。我的应用程序出现了一些问题。 如何将其更改为。loadNotes()等待上一个函数结束作业

多谢各位。 使用metod初始化数据库服务:

public static async void checkNoteAlarmTimeActive()
        {           
            List<Note> notes = await getTimeActiveNotes();

            foreach(Note note in notes)
            {
                if(note.AlarmTime < DateTime.Now)
                {
                    note.AlarmTimeActive = false;
                    updateRecord(note);
                }
            }
        }
public static async Task<List<Note>> getTimeActiveNotes()
        {
            var notes = await _dbConnect.Table<Note>().Where(i => i.AlarmTimeActive == true).ToListAsync();            
            return notes;
        }
public static async void checknoteArmTimeActive()
{           
List notes=wait getTimeActiveNotes();
foreach(注释中的注释)
{
if(note.AlarmTimei.AlarmTimeActive==true).toListSync();
回条;
}

简单的答案是添加async并等待

protected async override void OnAppearing()
        {
            await DataBaseService.checkNoteAlarmTimeActive();
            this.loadNotes();                       
            base.OnAppearing();
        }

您的
checknoteArmTimeActive()
方法返回void,因此不能可靠地等待它(基本上是fire and forget)

您应该始终返回
Task

最后要做的是将
async
关键字添加到
onapparring
,这样您就可以在其中使用
wait
(如肖恩·斯帕克曼所说):


请记住:由于
OnAppearing()
也会返回void,因此它会在调用方等待某个内容(在本例中是您的数据库调用)之后立即返回给调用方。因此,生命周期的其余部分将继续,方法的其余部分(在
等待
之后)将只在完成之后发生。

您还需要将checkNotAlarmTimeActive的方法签名更改为“public static async Task checknotearmtimeactive()”以等待它。我无法将此方法设置为“OnAppearing()”异步。@Klick:为什么不呢?是的。ContinueWith(…),这正是await在幕后创建的内容。但是,请注意,C#和JavaScript都已转移到
async
/
await
,这导致代码比Promissions/thenables更干净。
//C#
protected async override void OnAppearing()
{
    await DataBaseService.checkNoteAlarmTimeActive();
    this.loadNotes();                       
    base.OnAppearing();
}