Асинхронная проблема синхронизации - PullRequest
0 голосов
/ 28 июня 2018

Я звоню в репозиторий, который оборачивает ядро ​​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();
}

Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация о классе

Edit: Это оригинальный метод вызова со страницы

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

Это тогда должно было измениться на:

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

, чтобы заставить его принять ключевое слово await с измененным GetFacultySL из предложения ниже

1 Ответ

0 голосов
/ 28 июня 2018

Избегайте async void методов огня и забудьте.

Ссылка Async / Await - Лучшие практики в асинхронном программировании

Скорее всего, когда вызывается 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();
}

Теперь страница будет ждать заполнения данных, прежде чем отобразить страницу.

Ссылка Введение в бритвенные страницы в ASP.NET Core

...