如何在并行foreach中使用await? [复制]

2023-11-27

所以我花了大半夜的时间试图解决这个问题。

我有幸被介绍到Parallel.ForEach昨天,除了一个细节之外,它的工作原理就像我想要的那样。

我有以下内容:

Parallel.ForEach(data, (d) =>
{
    try
    {
        MyMethod(d, measurements);
    }
    catch (Exception e)
    {
        // log
    }
});

在“MyMethod”方法中,我完成了很多逻辑,其中大部分都很好,但我在获取数据的地方进行 API 调用,并使用async任务以便能够使用await为了让代码等待特定部分执行然后继续:

private async void MyMethod(PimData pimData, IEnumerable<ProductMeasurements> measurements)
{
    try
    {
        // a lot of logic but most relevant part 

        await Task.WhenAll(ExecuteMeasurmentAndChartLogic(pimData.ProductNumber, entity));

        await Task.WhenAll(resourceImportManager.HandleEntityImageFiles(pimData.ProductType + pimData.ProductSize,SwepImageType.Png, ResourceFileTypes.ThreeD, entity, LinkTypeId.ProductResource));

        await Task.WhenAll(resourceImportManager.HandleEntityImageFiles(pimData.ProductSketch, SwepImageType.Png, ResourceFileTypes.Sketch, entity, LinkTypeId.ProductResource));

    }
    catch (Exception e)
    {
        // log
    }
}

Problems:

1 对于初学者来说,循环在所有代码完成之前完成

2 第二个问题是我在很多 API 调用中收到“任务已取消”

3 第三,如上所述,代码不会等待每个方法完全执行。

我无法让它执行所有内容ExecuteMeasurmentAndChartLogic()方法 在继续下一步之前。

这给我带来了以下问题(更多问题):

在此方法中,我创建一个项目并将其添加到数据库中,该项目需要我从在内部完成的 API 调用中获取的更多信息ExecuteMeasurmentAndChartLogic()但问题是创建了几个项目,并且必须等待其余的数据,这不是我想要的。

旁注:我知道在所有数据之前创建一个项目并添加到数据库并不是最佳实践,但我正在集成 PIM,其过程很微妙

我希望运行多个线程,但同时我希望在继续下一个方法之前为每个项目执行完整的逻辑。

澄清:

多个项目正在运行

每个项目处理ALL在继续代码的下一部分之前需要处理的逻辑。通常这样做await.

在上面的代码中resourceImportManager()方法先执行ExecuteMeasurmentAndChartLogic()完了,这是我不想要的。

代替Parallel.ForEach我用了 :

Task task1 = Task.Factory.StartNew(() => MyMethod(data, measurements));
Task.WaitAll(task1);

但这并没有多大帮助。

对此相当陌生,无法理解我哪里做错了。

编辑: 更新了这个问题

编辑:这就是方式ExecuteMeasurmentAndChartLogic() looks:

public async Task ExecuteMeasurmentAndChartLogic(string productNumber, Entity entity)
{
    try
    {
        GrafGeneratorManager grafManager = new GrafGeneratorManager();
        var graphMeasurmentList = await MeasurmentHandler.GetMeasurments(productNumber);

        if (graphMeasurmentList.Count == 0) return;

        var chart = await grafManager.GenerateChart(500, 950, SystemColors.Window, ChartColorPalette.EarthTones,
                    "legend", graphMeasurmentList);

        await AddChartsAndAddToXpc(chart, entity, productNumber);
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
}

编辑: 背景: 我调用 API 来获取大量数据。对于此数据中的每个项目,我需要进行 API 调用并获取应用于该项目的数据。

阅读评论后,这也让我以不同的方式思考。我也许可以循环遍历所有项目并为它们执行较小的逻辑,并在任务列表中添加 URL 并创建一个单独的任务来逐一执行此任务。

将保持更新


不要使用Parralel.ForEach根本不。让您的方法返回 Task 而不是 void,收集所有任务并等待它们,如下所示:

Task.WaitAll(data.Select(d => MyMethod(d, someParam)).ToArray());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在并行foreach中使用await? [复制] 的相关文章

  • C++ Singleton 类 getInstance (作为 java)[重复]

    这个问题在这里已经有答案了 可能的重复 谁能给我提供一份 C 中的 Singleton 示例吗 https stackoverflow com questions 270947 can any one provide me a sample
  • 当“”可以分配给std::string时,为什么有“clear”方法?

    一个可以用string clear函数清空字符串 也可以使用空双引号 来执行此操作 有什么不同 当您分配一个空字符串时 编译器必须在数据部分存储一个空的 C 字符串 并创建代码以将指向它的指针传递给赋值运算符 然后 赋值运算符必须从数据部分
  • 函数原型和数组参数

    我正在学习 C 语法 并且已经开始研究数组了 我想问你一个问题 但首先让我回顾一下 这样我就知道我已经弄清楚了 我知道您可以使用以下语法将变量定义为数组 name
  • 将 LINQ to Entities 查询中的每个项目转换为接口的最佳方法是什么?

    我有一个实现 IUser 的实体对象 User IQueryable
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • ObservableCollection 上的“Cascade”绑定,包含其他 ObservableCollection

    我有一个项目需要显示合同列表 Class Affaire 每个合约都有一个阶段列表 类别阶段 我使用绑定在 2 个不同的 ListView 中显示它们中的每一个 问题是当我从 ListView 中删除一个 Phase 时 显示 Phases
  • 优化对绑定到 DataGridView 的 DataTable 的更新

    我的应用程序中有一个显示一些数据的表单 当我第一次显示表单时 我将一些数据加载到 DataTable 中 然后将 DataTable 绑定到 DataGridView 我还启动了一个异步方法来执行一些较慢的数据库查询 当这些慢查询完成时 我
  • 在 C 中声明和初始化数组

    C 有没有办法先声明然后初始化数组 到目前为止 我一直在初始化一个这样的数组 int myArray SIZE 1 2 3 4 但我需要做这样的事情 int myArray SIZE myArray 1 2 3 4 在 C99 中 您可以使
  • 为什么测试在 TeamCity 中运行比直接在 NUnit 中运行需要更长的时间?

    我进行了一些 C 性能测试 基本上运行两种不同的方法 并检查一种方法的运行速度是否比另一种方法快得多 当我在 NUnit 本地运行它们时 其中一个测试的运行速度是另一个测试的十倍 因此我有一个 NUnit 测试 它使用Stopwatch检查
  • 使用 for 循环创建链表

    这是我的结构 struct ListItem int data struct ListItem next 假设链表的第一个节点的 data 0 我想编写一个 for 循环来创建大小为 5 的链表 但我不知道如何工作 我尝试了以下方法 int
  • 复杂的 C 声明

    我刚刚在互联网上浏览了一些代码 发现了这个 float foo SIZE SIZE 我如何阅读这份声明 是否有一套特定的规则来阅读如此复杂的声明 我有一段时间没做这个了 从 开始foo然后向右走 float foo SIZE SIZE fo
  • C语言:如何获取使用strtok()一次后剩余的字符串

    我的字符串是 A B C D E 分隔符是 如何获取执行 strtok 一次后剩余的字符串 即 B C D E char a A B C D E char separator char b strtok a separator printf
  • C语言中如何将整数转换为字符? [复制]

    这个问题在这里已经有答案了 C语言中如何将整数转换为字符 C 中的字符已经是数字 字符的 ASCII 代码 无需转换 如果要将数字转换为相应的字符 只需添加 0 即可 c i 0 0 是 ASCii 表中的一个字符
  • 检测用户是否正在滚动 dataGridView 滚动条

    我正在更新一个dataGridView与一个新的数据表使用 dataGridView1 DataSource table 但是 我不想在用户滚动 dataGridView 时执行此操作 如何检查滚动条是否正在滚动或已完成滚动 即拖动而不是单
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • RabbitMQ + Windows + LDAP 无需发送密码

    我正在尝试在 Windows 7 上使用 RabbitMQ 3 6 2 进行 LDAP 身份验证 授权 我已经在应用程序发送用户名 密码的情况下进行了基本身份验证 但密码位于我需要弄清楚如何进行的代码中避免 有没有人在不提供密码的情况下成功
  • 在 C++ 中将大型数据向量写入/读取到二进制文件

    我有一个 C 程序 它通过将 ascii 文件中的网格人口数据读取到大型 8640x3432 元素双精度向量中来计算给定半径内的人口 将 ascii 数据读入向量大约需要 30 秒 循环每列和每行 而程序的其余部分只需要几秒钟 我被要求通过
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • Selenium WebDriver 在按钮单击事件上无法正常工作。这里有什么问题呢?

    I am using following code to scrape data from a website I have following interface 这是 HTML div class es content div

随机推荐

  • Android语音识别持续服务

    我正在尝试创建一项服务来在 Android 4 2 中运行连续语音识别 使用此链接中的答案 Android 语音识别作为 Android 4 1 和 4 2 上的服务 我创建了一个从活动运行的服务 我的问题是访问时出现空异常mTarget
  • 如果仅从前向列表中删除单个元素,如何有效地删除?

    嗯 我认为这个问题已经概括了这一点 我有一个包含唯一项目的forward list 并且想从中删除单个项目 std forward list
  • 从闭包填充集合时,类型不匹配“绑定生命周期参数”与“具体生命周期”

    我试图在可迭代序列中找到重复项 此外 我想知道到目前为止该序列中发生的元素 我创建了一个HashMap我正在尝试打电话insert从使用的闭包内对其进行take while 但是 由于与具体 绑定生命周期相关的类型不匹配 到目前为止我还没有
  • 销毁并重新加载子组件

    我需要能够完全重新加载子组件 实现这一目标的最佳方法似乎是使用一个简单的 ngIf具有布尔值 设置 false 来删除组件 然后设置为 true 来重新初始化它 即
  • 如何检索ag-grid中的列索引?

    In ag grid 当我想检索我使用的行索引时 params node id 但是 我找不到对列执行相同操作的方法 我发现的只是检索columnId它引用列定义中的字段变量 即 如果这是列定义 headerName checkButton
  • 以编程方式添加应用程序图标以在安装时停靠

    我希望在安装软件包 DMG 后将我的应用程序自动添加到扩展坞中 有谁知道如何做到这一点 安德鲁 有几种方法可以做到这一点 其中很大程度上取决于您如何安装应用程序 如果您使用 PackageMaker 安装应用程序 则可以运行 postfli
  • Redux-Form 通过外部交互更新字段值

    我有一个 redux form 连接到我的应用程序状态 一切似乎都运行良好 我可以获取数据并将其加载到我的表单中 然后提交数据并获取我想要的元数据 但是 我有一个自定义交互 颜色选择器 需要动态更改托管字段的值 我尝试的所有操作都会改变屏幕
  • 在c#中通过USB驱动POS打印机[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我有什么想法可以最好地从 C 驱动 USB POS 打印机 POS 打印机通常是基于串行 TCP IP 或 USB 的 我知道如何完成串行和 TCP
  • 如何找到调用者函数? [复制]

    这个问题在这里已经有答案了 关闭为完全相同的副本 如何找到调用当前方法的方法 Is this可以用c 吗 void main Hello void Hello how do you find out the caller is functi
  • 使用async需要async函数,但我的函数是async

    我正在改编一个使用回调的库使用承诺 当我使用时它正在工作then 但是当我使用时它不起作用await gt dbc solve AsyncFunction gt await dbc solve img await dbc solve img
  • 为什么 VB.Net 中每个窗体都有默认实例,而 C# 中却没有?

    我只是想知道有 Name 属性 它代表 Form 类的名称 此属性在命名空间内用于唯一标识窗体是其实例的类 并且在 Visual Basic 的情况下 用于访问窗体的默认实例 现在这个默认实例从何而来 为什么 C 不能有一个与此等效的方法
  • Rails 4:acts_as_taggable_on 的 text_field 不使用逗号分隔标签

    我试图让表单中的 text field 部分为逗号分隔的acts as taggable on 标签 现在 当我重新加载页面时 逗号会消失 因此如果一个字段有两个或多个标签 它们就会变成一个大标签 例如 我得到 Tag1 Tag2 Tag3
  • 系统调用期间发生 I/O 错误,S3 客户端的对等问题导致连接重置

    当尝试将文件 图像 音频 上传到 S3 时 我偶尔会遇到此异常 有什么解决办法吗 配置 Android 4x 5x aws android sdk s3 版本 2 2 14 Unable to execute HTTP request Wr
  • XML 可绘制对象在 4.3 和 4.1.2 上具有不同的行为

    我有以下可绘制的
  • 如何检查机器人是否连接到频道? |不和谐.py

    我决定尝试让我的不和谐机器人播放音乐 但我已经陷入困境了 主要是由于我找不到任何资源来帮助当前版本 所以我一直在参考文档中的所有内容 但是 我不知道如何检查机器人是否连接到语音通道 我努力了if not Client is connecte
  • initWithNibName VS viewDidLoad

    我几个小时以来一直试图了解何时应该使用 viewDidload 以及何时应该使用 initWithNibName 来设置 viewController 的属性 例如 我正在使用 TableViewController 并在 initWith
  • 与 pandas 中的 df.diff() 相反

    我搜索了论坛 寻找一种更清晰的方法来在数据框中创建一个新列 该新列是该行与前一行的总和 与 diff 函数相反 它取差值 这就是我目前解决问题的方式 df pd DataFrame c dd ee ff gg hh d 1 2 3 4 5
  • 如何刷新填充有BaseAdapter的Fragment中的ListView?

    我想在对话框关闭时刷新片段中的 ListView 到目前为止 刷新仅在我重新启动应用程序时才有效 我真的不知道为什么 以下是课程 这是带有 ListView 的片段 我想在对话框关闭时刷新它 public class RegisterLis
  • .net WebApi OData + Breeze => [Q] 未处理的拒绝原因(应为空)

    我有一个带有 OData EntitySetController 的 net 4 5 Web Api 在客户端我加载了以下js文件 jquery min js q min js datajs 1 1 1 min js breeze debu
  • 如何在并行foreach中使用await? [复制]

    这个问题在这里已经有答案了 所以我花了大半夜的时间试图解决这个问题 我有幸被介绍到Parallel ForEach昨天 除了一个细节之外 它的工作原理就像我想要的那样 我有以下内容 Parallel ForEach data d gt tr