Ключевое слово await
остановит выполнение вашего метода до завершения Task
.После завершения await
либо вернет результат Task
, либо выдаст исключение, которое произошло внутри Task
(если оно было).Таким образом, нет смысла проверять, не произошел ли сбой Task
, если вы его уже ожидали, потому что, если бы он вышел из строя, await
вызвал бы исключение.
Просто оберните его в try
/ catch
block.
Но ваш код даже не скомпилируется, потому что:
DbSet<T>.RemoveRange
не возвращает Task
, потому что он не 'на самом деле вообще не могу общаться с базой данных.Он просто удаляет записи в памяти.Вам нужно позвонить DbContext.SaveChangesAsync()
, чтобы ваши изменения были зафиксированы. - Вы на самом деле не передаете список объектов на
RemoveRange
.(Вы изменили этот код для этого примера?) - Как только вы ожидаете
Task
, ключевое слово await
возвращает результат этого Task
, а не сам Task
.
Вот пример того, как вы могли бы написать это:
public virtual async Task<OperationResult> DeleteAsync(Expression<Func<TEntity, bool>> expression) {
_DbContext.Set<TEntity>().RemoveRange(somethinghere);
try {
//commit the changes
var result = await _DbContext.SaveChangesAsync();
//result will be an int (the number of records changed), not a Task
//if we got this far, we succeeded
return new OperationResult()
{
Message = "",
ReturnObject = null,
Status = OperationStatus.Deleted,
Succeeded = true
};
} catch (Exception e) {
return new OperationResult()
{
Message = "", //you can use e.Message here if you want
ReturnObject = null,
Status = OperationStatus.UnknownError,
Succeeded = false
};
}
}
Обратите внимание, что вы можете просто написать:
await _DbContext.SaveChangesAsync();
Если вы не собираетесь использовать result
.