我想知道用下面的方式做一些异步操作是否正确。
下面是使用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);
}好吧,这没问题,因为它是经典的。
现在,为了拥有相同的异步方法,我可以这样写它:
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));
}发布于 2017-02-10 08:29:04
你张贴的代码与SingleOrDefaultAsync的运行方式不同,实际上它的性能可能比你不执行Task.Run/async要差,因为Task.Run有开销。
SingleOrDefaultAsync是对数据库的真正异步调用,事实上,如果您使用CancellationToken并取消查询,它实际上会终止数据库中的查询。
https://stackoverflow.com/questions/42149380
复制相似问题