【问题标题】:Sync to Async - Best practices to make synchronous asynchronousSync to Async - 使同步异步的最佳实践
【发布时间】:2017-02-10 08:37:14
【问题描述】:

我想知道通过以下方式进行一些异步操作是否正确。

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

【问题讨论】:

  • 这个问题的意义何在?使用异步方法即可,也可以使用FindAsync
  • return Task.Run(() => Find(id)).wait()
  • @MikeDarwish 那么它不会是异步的
  • 问题是关于我的异步代码(第二块)。它和我调用 SingleOrDefaultAsync 一样吗?
  • 看起来您的问题在这里得到了回答:stackoverflow.com/questions/21817569/…,是的,您是正确的,用 SingleOrDefaultAsync 替换 SingleOrDefault 就可以了。

标签: c# asynchronous entity-framework-6


【解决方案1】:

您发布的代码与 SingleOrDefaultAsync 的运行方式不同,实际上它的性能可能会比您根本不执行 Task.Run/async 更差,因为 Task.Run 有开销。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2011-08-12
    • 2013-02-02
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多