【问题标题】:Async timing issue异步计时问题
【发布时间】:2018-06-27 22:21:46
【问题描述】:

我正在调用包装 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 关键字和以下建议中修改后的 GetFacultySL

【问题讨论】:

    标签: c# asynchronous asp.net-core razor-pages


    【解决方案1】:

    避免使用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

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 2011-02-16
      • 2017-12-31
      • 1970-01-01
      • 2010-12-16
      相关资源
      最近更新 更多