Xamarin,等待异步函数结束。

4
在主文件MainPage中,我有一个名为OnAppearing的方法,包含两个函数。
MainPage.cs
 protected override void OnAppearing()
        {
            DataBaseService.checkNoteAlarmTimeActive();
            this.loadNotes();                       
            base.OnAppearing();
        }

很遗憾,方法loadNotes()在方法DataBaseService.checkNoteAlarmTimeActive();结束之前被触发了。这会在我的应用程序中出现一些问题。 怎样才能使this.loadNotes()等待前一个函数结束后再执行呢?

谢谢! 具有以下方法的类DataBaseService:

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;
        }
2个回答

2
简短的回答是您需要添加async和await。
protected async override void OnAppearing()
        {
            await DataBaseService.checkNoteAlarmTimeActive();
            this.loadNotes();                       
            base.OnAppearing();
        }

1
您还需要更改 checkNotAlarmTimeActive 方法的签名为 "public static async Task checkNoteAlarmTimeActive()" 以便等待它。 - Will Decker
我无法将这个方法 "OnAppearing()" 改为异步。 - Klick
@Klick:为什么不呢? - Stephen Cleary
抱歉,我将“async”加在了错误的位置。现在它已经可以正常工作,谢谢。但是,是否有其他方法可以不使此函数成为async?在ES6中,有一个很好的“promises”系统和“then”函数。在C#、Xamarin中是否有类似的东西呢? - Klick
3
没错,.ContinueWith(...) 就是 await 在幕后创建的东西。 - Kai Brummund
2
请注意,C#和JavaScript都已经转向async/await,这会比promises/thenables产生更干净的代码。 - Stephen Cleary

2

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

您应该始终返回Task

最后要做的是向OnApprearing添加async关键字,这样您就可以在其中使用await(就像Sean Sparkman所说的那样):

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

请记住:由于OnAppearing()也返回void,因此在那里等待某些内容(在这种情况下是您的数据库调用)后,它将立即返回给调用者。因此,生命周期的其余部分将继续,并且在await之后的方法的其余部分将只在完成后发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接