C# 同步到异步-使同步异步化的最佳实践
我想知道用下面的方法做一些异步操作是否正确 以下是使用查找方法获取某些数据的sync经典代码:C# 同步到异步-使同步异步化的最佳实践,c#,asynchronous,entity-framework-6,C#,Asynchronous,Entity Framework 6,我想知道用下面的方法做一些异步操作是否正确 以下是使用查找方法获取某些数据的sync经典代码: public override Personne Find(object id) { return this.dbSet.OfType<Personne>() .Include(a => a.Adresse) .Include(c =
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);
}
公共覆盖人员查找(对象id)
{
返回这个类型为()的.dbSet
.包括(a=>a.地址)
.包括(c=>c.PersonneCivilite)
.SingleOrDefault(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);
}
公共异步覆盖任务FindAsync(对象id)
{
return等待this.dbSet.OfType()
.包括(a=>a.地址)
.包括(c=>c.PersonneCivilite)
.SingleOrDefaultAsync(p=>p.PersonneId==(int)id);
}
但是下面的方法是严格地做同样的事情吗?
因为它允许我编写异步方法,而无需代码粘贴查询参数
public async override Task<Personne> FindAsync(object id)
{
return await Task.Run<Personne>(() => Find(id));
}
公共异步覆盖任务FindAsync(对象id)
{
返回等待任务。运行(()=>Find(id));
}
您发布的代码的操作与SingleOrDefaultAsync不同,事实上,它的性能可能会比不执行Task时差。Run/async完全是Task。Run有开销
SingleOrDefaultAsync是对数据库的真正异步调用,事实上,如果使用CancellationToken并取消查询,它实际上会终止数据库中的查询。这个问题的重点是什么?只要使用异步方法,您也可以使用
FindAsync
返回任务。运行(()=>Find(id)).wait()@MikeDarwish,那么它将不会是异步的。问题是关于我的异步代码(第二块)。它的工作原理是否与我调用SingleOrDefaultAsync的工作原理相同?看起来您的问题在这里得到了回答:,是的,将SingleOrDefaultAsync
替换为SingleOrDefaultAsync
确实有效。