首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >foreach循环中的异步调用

foreach循环中的异步调用
EN

Stack Overflow用户
提问于 2018-08-14 12:48:45
回答 4查看 2.2K关注 0票数 2

更像是一个概念问题..。在foreach循环中对我的DataContext进行异步调用有什么不好的原因吗?

代码语言:javascript
代码运行次数:0
运行
复制
private async Task ProcessItems(List<Item> items)
{
    var modifiedItems = new List<modifiedItem>();

    foreach (var item in items)
    {
        // **edited to reflect link between items and properties**
        // var properties = await _context.Properties
        //   .Where(p => p.Condition == true).ToListAsync();
        var properties = await _context.Properties
          .Where(p => p.Condition == item.Condition).ToListAsync();

        foreach (var property in properties)
        {
            // do something to modify 'item'
            // based on the value of 'property'
            // save to variable 'modifiedItem'

            modifiedItems.Add(modifiedItem)
        }
    }

    await _context.ModifiedItems.AddRangeAsync(modifiedItems);
    await _context.SaveChangesAsync();
}

由于内部foreach循环依赖于properties变量,它不是在properties变量完全实例化之后才开始吗?

由于modifiedItems变量是在父foreach循环之外声明的,异步将每个modifiedItem添加到modifiedItems列表是不是一个坏主意?

在实体框架Linq中是否有任何更适合这种任务的属性/方法?比做嵌入的前端循环更好的主意?

(万一有人想了解情况.IRL,items是传感器读数的列表。properties是将原始读数转换成有意义的数据的数学方程,如体积和重量在不同的单位.然后,这些计算出的数据点被存储在数据库中。)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-14 12:56:33

不,没有,但是你错过了一些概念。

因为您使用了异步方法,所以ProcessItems方法应该被称为ProcessItemsAsync并返回一个task

这对你是有用的:异步/等待-异步编程的最佳实践

根据您的需要,建议添加CancellationToken并考虑异常处理,只是不考虑吞咽例外

票数 4
EN

Stack Overflow用户

发布于 2018-08-14 13:00:58

这里没有使用异步的问题,一旦您等待异步调用,返回的对象是相同的。

如果您可以在循环之外运行一次DB调用,并过滤内存中的数据以对其进行操作,那么您可能需要重新考虑在foreach中执行DB调用。每个用例都是不同的,您必须确保可以在内存中处理更大的返回集。

通常一次从DB获得1000行的速度比100行快10倍。

票数 1
EN

Stack Overflow用户

发布于 2018-08-14 13:06:22

在这种特殊情况下,我会编写它来加载所有感兴趣的传感器的所有属性的单个列表(考虑所有的items,并基于您提到的macAddress/sensorKey属性),并将其存储在一个列表中。我们叫它allProperties。我们只进行一次await,避免重复进行数据库调用。

然后,使用LINQ对象将您的items连接到它们匹配的allProperties中的对象。迭代该联接的结果,在循环中没有await可执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51841860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档