Назрел следующий вопрос.
Есть задача - все запросы к БД должны происходить в асинхронном режиме. Я примерно представляю(и реализовал) такую возможность, но мне кажется, что я где-то сделал ошибку.
Инициатором самого обращения к БД служит обработка события нажатия на кнопку
private async void MenuItem_Click_3(object sender, RoutedEventArgs e)
{
try
{
ShowFrameInBrowser((await _videos.GetAsync((int)VideoNames.RAMWork)).URL);
ActionsToMakeVisibleBrowser();
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
далее мы приходим вот сюда
public async Task<Video> GetAsync(int id)
{
using (_db = new VideosContext(_options))
{
if (_db.Videos.AsNoTracking().Any(v => v.Id == id))
{
return await _db.Videos.AsNoTracking().FirstAsync(v => v.Id == id);
}
else
{
throw new Exception("По указанному индексу не нашлось видео");
}
}
}
Работает-то оно все как надо(по моим меркам), но что я не до конца понимаю - в каком месте должен стоять await в 2-х случаях:
- Когда метод возвращает void
- Когда метод возвращает Task
Насколько я понимаю, после того как написано await весь код ниже будет выполняться и так в другом потоке.
И у меня 2 вопроса:
- Первое обращение к БД в методе выше происходит в этой строчке
_db.Videos.AsNoTracking().Any(v => v.Id == id)и я хотел именно здесь применить конструкцию await, но, поскольку я должен вернуть Task, я этого не делаю. Правильно ли я поступаю? - Если метод возвращает void, то я должен ставить await при первом обращении к БД как в примере ниже?
public async void CreateAsync(Video item)
{
using (_db = new VideosContext(_options))
{
if(!await _db.Videos.AnyAsync(v => v.Name == item.Name))
{
_db.Add(item);
_db.SaveChanges();
}
else
{
throw new Exception("Попытка добавить существующее видео")
}
}
}