我想知道以下列方式进行异步操作是否正确。
以下是使用Find方法获取某些数据的同步经典代码:
public override Personne Find(object id)
{
return this.dbSet.OfType<Personne>()
.Include(a => a.Adresse)
.Include(c => c.PersonneCivilite)
.SingleOrDefault<MajeurProtege>(p => p.PersonneId == (int)id);
}
嗯,没问题,因为它很经典。
现在使用相同的方法Async我可以这样写:
public async override Task<Personne > FindAsync(object id)
{
return await this.dbSet.OfType<Personne >()
.Include(a => a.Adresse)
.Include(c => c.PersonneCivilite)
.SingleOrDefaultAsync<MajeurProtege>(p => p.PersonneId == (int)id);
}
但以下方法是否完全相同? 因为它可以让我编写我的异步方法,而无需代码粘贴我的查询参数。
public async override Task<Personne> FindAsync(object id)
{
return await Task.Run<Personne>(() => Find(id));
}
答案 0 :(得分:3)
您发布的代码与SingleOrDefaultAsync的运行方式不同,实际上它可能会比在Task.Run有开销时完全没有执行Task.Run/async更糟糕。
SingleOrDefaultAsync是对数据库的真正异步调用,实际上如果您使用CancellationToken并取消查询,它将实际终止数据库中的查询。