异步计时问题

时间:2018-06-27 22:21:47

标签: 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 );
}

刷新页面时,有时会填充下拉列表,有时则不会。我在技术方面迟到了(异步并等待),并且尝试学习,我知道某个地方可能很愚蠢,希望有经验的眼睛可以看到问题所在。

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

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

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

public IActionResult OnGet()
{
    PopulateFacultySL(null);
    return Page();
}

然后必须更改为:

public async Task<IActionResult> OnGet()
{
    FacultySL = await GetFacultySL( null );
    return Page();
}

根据以下建议,使其接受经过修订的await的{​​{1}}关键字

1 个答案:

答案 0 :(得分:7)

避免使用async void忘记方法。

引用Async/Await - Best Practices in Asynchronous Programming

可能是,当调用PopulateFacultySL时,有时在发送给客户端之前未及时完成要包含在响应中。这就是为什么有时填充它而有时不填充页面的原因,因为它们是并行调用的。

您需要做的是重构方法,以便可以等待它。

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

并等待页面加载

public async Task<IActionResult> OnGetAsync() {
    await PopulateFacultySL();
    return Page();
}

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

引用Introduction to Razor Pages in ASP.NET Core