异步计时问题
Async timing issue
我正在调用包装 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();
}
如果您需要查看任何其他 class 信息,请告诉我
编辑:
这是页面的原始调用方法
public IActionResult OnGet()
{
PopulateFacultySL(null);
return Page();
}
然后必须更改为:
public async Task<IActionResult> OnGet()
{
FacultySL = await GetFacultySL( null );
return Page();
}
使其接受 await
关键字以及根据以下建议 GetFacultySL
修改后的
避免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();
}
现在页面将在显示页面之前等待数据被填充。
我正在调用包装 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();
}
如果您需要查看任何其他 class 信息,请告诉我
编辑: 这是页面的原始调用方法
public IActionResult OnGet()
{
PopulateFacultySL(null);
return Page();
}
然后必须更改为:
public async Task<IActionResult> OnGet()
{
FacultySL = await GetFacultySL( null );
return Page();
}
使其接受 await
关键字以及根据以下建议 GetFacultySL
修改后的
避免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();
}
现在页面将在显示页面之前等待数据被填充。