Первое, что вы сделаете, - измените вызов самого низкого уровня на использование асинхронной версии и используйте async
в его включающем методе / лямбде.Тогда позвольте async
расти оттуда.Таким образом, первым шагом будет:
return Execute<Student, Student>(async (repository) => {
return await repository.Insert(student);
});
Этот код тогда требует Execute
, чтобы разрешить асинхронных делегатов .На этом этапе мы, вероятно, хотим, чтобы другой код продолжал использовать синхронный Execute
, поэтому мы можем скопировать / вставить его и заставить новую перегрузку принимать асинхронный делегат:
private static async Task<TResult> Execute<TResult, T>(Func<Repository<T>, Task<TResult>> func) where T: class
{
using(PracticeContext context = new PracticeContext())
{
try
{
return await func(new Repository<T>(context));
}
catch(Exception ex)
{
Console.WriteLine(ex);
throw new Exception("Error Occured.");
}
}
}
Теперь, когда асинхронный Execute
возвращает Task<T>
, затем нам нужно await
вернуть его обратно в вызывающий метод:
return await Execute<Student, Student>(async (repository) => {
return await repository.Insert(student);
});
, что затем делает вызывающий метод также асинхронным:
public static async Task<Student> InsertAsync(Student student)
{
try
{
return await Execute<Student, Student>(async (repository) => {
return await repository.Insert(student);
});
}
catch (Exception ex)
{
Console.WriteLine(ex);
return null;
}
}