异步计时问题

Sim*_*mon 2 c# asynchronous asp.net-core razor-pages

我正在调用一个包装EF核心的存储库,弄乱了contoso示例

public async void PopulateFacultySL( object selectedFaculty )
{
    var data = await GetUnitOfWork().Faculties.GetAllAsync();
    FacultySL = new SelectList( data, "Id", "Name", selectedFaculty );
}
Run Code Online (Sandbox Code Playgroud)

刷新页面时,有时会填充下拉列表,有时则不会.我迟到了技术(异步和等待)并试图学习,我知道它可能是某种愚蠢的东西,并希望有经验的人可以看到问题是什么.

protected DbSet<TEntity> TypedContext => Context.Set<TEntity>();
public virtual Task<List<TEntity>> GetAllAsync()
{
    return ReturnAndFilterByInstitutionAsync( TypedContext.AsQueryable() );
}

public Task<List<TEntity>> ReturnAndFilterByInstitutionAsync( IQueryable<TEntity> query )
{
    return query.Where( q => q.InstitutionId == InstitutionId ).ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)

如果您需要查看任何其他课程信息,请告诉我

编辑:这是页面中的原始调用方法

public IActionResult OnGet()
{
    PopulateFacultySL(null);
    return Page();
}
Run Code Online (Sandbox Code Playgroud)

然后必须改为:

public async Task<IActionResult> OnGet()
{
    FacultySL = await GetFacultySL( null );
    return Page();
}
Run Code Online (Sandbox Code Playgroud)

使其接受来自以下建议await修订的关键字GetFacultySL

Nko*_*osi 7

避免async void火灾和忘记方法.

参考Async/Await - 异步编程的最佳实践

有可能在PopulateFacultySL调用时,有时它没有及时完成,以便在将响应发送到客户端之前包含在响应中.这就是为什么有时会填充它,有时它不是在刷新页面时,因为它们是并行调用的.

你需要做的是重构方法,以便等待它.

public async Task PopulateFacultySL(object selectedFaculty = null) {
    var data = await GetUnitOfWork().Faculties.GetAllAsync();
    FacultySL = SelectList(data, "Id", "Name", selectedFaculty);
}
Run Code Online (Sandbox Code Playgroud)

并在页面加载时等待它

public async Task<IActionResult> OnGetAsync() {
    await PopulateFacultySL();
    return Page();
}
Run Code Online (Sandbox Code Playgroud)

现在,页面将在显示页面之前等待填充数据.

ASP.NET核心中Razor页面的参考介绍