同步到异步 - 实现同步异步的最佳实践

时间:2017-02-10 00:16:20

标签: c# asynchronous entity-framework-6

我想知道以下列方式进行异步操作是否正确。

以下是使用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));
    }

1 个答案:

答案 0 :(得分:3)

您发布的代码与SingleOrDefaultAsync的运行方式不同,实际上它可能会比在Task.Run有开销时完全没有执行Task.Run/async更糟糕。

SingleOrDefaultAsync是对数据库的真正异步调用,实际上如果您使用CancellationToken并取消查询,它将实际终止数据库中的查询。