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

标签 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);
    }

好吧,这没有问题,因为它很经典。

现在有了相同的异步方法,我可以这样写:

    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/

相关文章:

c# - Asp.Net Core - 错误无法使用主管在已发布的(Ubuntu 14.04)Web 应用程序上执行二进制文件

c# - 如何在 ScriptManager.RegisterStartupScript 中使用外部 js 文件?

c# - AsyncWaitHandle.WaitOne 会阻塞 CLR 线程吗?或者它是否创建一个 I/O 完成端口?

c# - OData $expand URL 限制?

c# - 使用多个数据库表的 ASP.NET MVC 模型

c# - LINQ to SQL 类

asp.net - 只执行最后调用的函数

c - 异步非阻塞服务器套接字的效率

c# - EF6 在单次调用中获取计数

entity-framework - 每个表中的列名必须是唯一的。表 'StripeRecipientId' 中的列名 'dbo.Foos' 被指定多次