【问题标题】:Async search request异步搜索请求
【发布时间】:2021-04-20 10:15:43
【问题描述】:

我已经有一年没有编码了,我需要一些关于 LinqPad 的帮助。我需要运行多个搜索查询来从我的数据库中获取数据。

假设我需要跑步

void DeepSearch(string input)
{
    Orders.Where(y => y.OrderReference.Contains(input)).Dump();
    Invoice.Where(y => y.InvoiceReference.Contains(input)).Dump();
    Clients.Where(y => y.Name.Contains(input)).Dump();
}

为了提高性能,我想同时启动这 3 个查询,并在我得到结果后立即转储。我不在乎顺序。

我可以简单地添加异步吗?

async void DeepSearch(string input)
{
    Orders.Where(y => y.OrderReference.Contains(input)).Dump();
    Invoice.Where(y => y.InvoiceReference.Contains(input)).Dump();
    Clients.Where(y => y.Name.Contains(input)).Dump();
}

【问题讨论】:

    标签: c# asynchronous linqpad


    【解决方案1】:

    不,你不能; “异步”与“并行”不同,即使是:数据源也需要设计用于(分别)异步和/或并行。我猜测 OrdersInvoicesClients 这里是共享数据库连接(可能使用 EF)上的 LINQ 提供程序,在这种情况下:ADO.NET 中的数据库连接不是t 设计用于并发/并行。此外,LINQ 不直接公开异步操作,但是:EF 确实对异步执行做出了一些让步——如果你使用像Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync() 这样的方法,这只是意味着:“在文件顶部添加using Microsoft.EntityFrameworkCore;,并使用await source.Where(...).ToListAsync()"。

    但是:

    • 在不并行的情况下进行异步不会提高您直接观察到的性能;这只是意味着您在等待数据库时不会占用线程(有限的资源),从而允许线程被释放并执行比等待更有趣的事情
    • 并发很复杂,需要或者单独的隔离连接(等),或者设计用于并发的连接

    【讨论】:

    • 可能使用 EF... 正确
    • @TheodorZoulias 是的,你是对的 - 将编辑(CPU 当然会在网络上进行冷等待,但仍会占用线程,这很昂贵)
    【解决方案2】:

    如果您为每个并行操作实例化一个单独的数据上下文,您当然可以并行运行查询。 (这是必需的,因为数据上下文不是线程安全的,无论是 LINQ-to-SQL 还是 EF Core)。

    LINQPad 自动生成的数据上下文称为TypedDataContext,因此您在 LINQPad 中的代码将如下所示:

    Task.Run(() => new TypedDataContext().Orders.Where(y => y.OrderReference.Contains(input)Dump());
    Task.Run(() => new TypedDataContext().Invoices.Where(y => y.InvoiceReference.Contains(input)).Dump());
    Task.Run(() => new TypedDataContext().Clients.Where(y => y.Name.Contains(input).Dump());
    

    如果将任务分配给变量,则可以等待它们(或使用Task.WhenAll 等待它们全部)。

    根据您使用的是 LINQ-to-SQL 还是 EF Core,还存在与实例化数据上下文相关的成本,因此您可能希望在同一线程上的后续操作中重复使用相同的 TypedDataContext。

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 2022-12-19
      • 2014-07-13
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多