【问题标题】:Returning Task<bool> from LINQ's Any method?从 LINQ 的 Any 方法返回 Task<bool>?
【发布时间】:2017-09-19 10:05:43
【问题描述】:

我有这个界面:

public interface ISign
{
   Task<bool> IsRegisteredCopy();
}

实现了:

public class Sign : ISign
    {
        TabibContext context = new TabibContext();
        public Task<bool> IsRegisteredCopy()
        {
            return context.Doctors.Any();
        }
    }

所以我需要从不可用的Any 方法返回任务!

【问题讨论】:

  • return context.Doctors.AnyAsync();
  • 在 IntelliSense 中不可用!
  • 您是否导入了 System.Data.Entity 命名空间?
  • 不,以为它存在于System.Data

标签: c# linq asynchronous task


【解决方案1】:

Entity Framework 有多种async extensions 可以在System.Data.Entity 命名空间中使用。所以你可以这样做:

using System.Data.Entity;

public Task<bool> IsRegisteredCopy()
{
    return context.Doctors.AnyAsync();
}

【讨论】:

    【解决方案2】:

    您有几种方法可以做到这一点。其中之一是 Matthew Watson 的方式 (return Task.Run(() =&gt; context.Doctors.Any());)。这不是一种好的做法(请查看 question 中的 Stephen Cleary 答案和链接)。

    这是另一种不需要您实际运行任务的方式。您可以在没有这样的任务的情况下返回任务:

    return Task.FromResult(context.Doctors.Any());
    

    这样,您可以在不触发所有任务内容的情况下返回一个值。当您的方法中实际上没有任务时,这是一种更好的做法。

    注意:在 Entity Framework 的最新版本中,您有一个更好的 AnyAsync 方法:

    public async Task<bool> IsRegisteredCopy()
    {
        return await context.Doctors.AnyAsync();
    }
    

    您需要使用以下命令添加:System.Data.Entity;

    【讨论】:

    • 当你可以简单地return 时,你为什么还要return await
    • @EricLippert > 虽然简单地返回任务更有效(编译器不会添加所有等待的东西),但 Stephen Cleary 有一篇不错的博客 article 介绍了这一点。简短回答:建议始终对复杂代码使用 async/await。例如,当您使用 using 子句时,对 Dispose() 的调用可能会破坏某些内容。异常捕获也会受到您调用 await 等的影响。
    • @fharreau 以防万一你没有意识到...... Eric 帮助创建了 C#,所以他可能不会要求你向他解释 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多