我想知道按以下方式执行一些异步操作是否正确。
以下是使用 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));
}
最佳答案
您发布的代码的运行方式与 SingleOrDefaultAsync 不同,事实上,它的性能可能比您根本不执行 Task.Run/async 更差,因为 Task.Run 有开销。
SingleOrDefaultAsync 是对数据库的真正异步调用,事实上,如果您使用 CancellationToken 并取消查询,它实际上会终止数据库中的查询。
关于c# - 同步到异步 - 使同步异步的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42149380/