Xamarin,等待异步功能结束

时间:2017-08-16 18:14:17

标签: xamarin async-await

在主文件MainPage中我有方法OnAppearing包含两个函数。

MainPage.cs

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;
        }

不幸的是,在方法 DataBaseService.checkNoteAlarmTimeActive(); 结束之前,会触发 loadNotes()方法。它在我的应用程序中出现问题。 如何将其更改为 this.loadNotes()等待以前的功能结束工作?

谢谢。 带有metod的类DataBaseService:

{{1}}

2 个答案:

答案 0 :(得分:2)

简短的回答是你添加了异步并等待。

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

答案 1 :(得分:2)

你的CheckNoteAlarmTimeActive()方法返回void,因此无法可靠地等待它(它基本上是火不会忘记)。

您应该始终返回Task

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

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

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