Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同步到异步-使同步异步化的最佳实践_C#_Asynchronous_Entity Framework 6 - Fatal编程技术网

C# 同步到异步-使同步异步化的最佳实践

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 =

我想知道用下面的方法做一些异步操作是否正确

以下是使用查找方法获取某些数据的sync经典代码:

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
确实有效。