c# - 使用 EF Core 时异步调用比同步调用慢

标签 c# entity-framework asp.net-core async-await ef-core-2.1

知道为什么这段代码需要 49 毫秒

public void OnGet(String sessionId)
{
    BackgroundEntry =  _context.BackgroundEntry.Where(x => x.Id == sessionId).ToList();
}

但是这段代码需要 300+ 毫秒?

public async Task OnGetAsync(String sessionId)
{
    BackgroundEntry = await _context.BackgroundEntry.Where(x => x.Id == sessionId).ToListAsync();
}

我希望两者的时间相同。 在各种条件下对此进行了测试,结果始终相同,异步有 300+ 毫秒的延迟。

BackgroundEntry 由 EF 自动生成:

public partial class BackgroundEntry
{
    public string Id { get; set; }
    public string Part { get; set; }
    public long Datetime { get; set; }
    public DateTime CreatedAt { get; set; }
    public Guid Session { get; set; }
    public string Action { get; set; }
    public string Domain { get; set; }
    public string Location { get; set; }
    public long? LastEntryDatetime { get; set; }

    public BackgroundEntry BackgroundEntryNavigation { get; set; }
    public BackgroundEntry InverseBackgroundEntryNavigation { get; set; }
}

使用秒表进行基准测试:

        using (Models.RecorderContext context = new Models.RecorderContext())
        {
            sw.Start();
            var BackgroundEntry = context.BackgroundEntry.Where(x => x.Id == sessionId).ToList();
            sw.Stop();
        }

        var g = sw.ElapsedMilliseconds;

        sw.Reset();
        // g = 22 ms

        using (Models.RecorderContext context = new Models.RecorderContext())
        {
            sw.Start();
            var BackgroundEntry = await context.BackgroundEntry.Where(x => x.Id == sessionId).ToListAsync();
            sw.Stop();
        }

        g = sw.ElapsedMilliseconds;

        // g = 328 ms

最佳答案

在没有更多上下文的情况下不可能准确地说,但总的来说,我认为您错误地假设异步应该更快,而实际上恰恰相反。

异步是关于规模,而不是性能。它允许您更有效地使用服务器资源,但为此会付出性能成本,即使只是很小的成本。处理异步、线程切换等会产生开销,所有这些都会使相同的操作实际上比等效的同步操作慢。但是,同步不提供在线程空闲时将其用于其他工作的机会,因此使用同步操作会限制潜在的服务器吞吐量。这是一种权衡,通常将异步作为最佳方法。

关于c# - 使用 EF Core 时异步调用比同步调用慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52488952/

相关文章:

c# - 提交前的 Nhibernate HiLo id 值

wpf - 如何使用 EntityCollection 对象的 HierarchicalDataTemplate 对 WPF TreeView 进行排序?

c# - 简化 Linq 表达式

authentication - Blazor 服务器无法访问具有 [Authorize] 属性的 Controller

asp.net-core - 调试 session 结束时IIS Express没有停止

c# - SlideInEffect 和 TurnstileFeatherEffect 不起作用

c# - 使用 EPPlus 生成 excel 文件失败

c# - Xamarin.Auth:更新应用程序时不会保留帐户数据

c# - 将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围 - 未使用 DateTime2

c# - JWT 身份验证 - UserManager.GetUserAsync 返回 null