调用并行化 foreach 时出现问题

2023-12-13

我在使用 System.Threading.Tasks.Parallel.ForEach 时遇到问题。每个要更新的进度条的主体。 但Invoke方法有时会冻结。

我将代码附加到进度条和按钮的表单中。

private void button1_Click(object sender, EventArgs e)
{
    DateTime start = DateTime.Now;
    pforeach();
    Text = (DateTime.Now - start).ToString();
}


private void pforeach()
{
    int[] intArray = new int[60];
    int totalcount = intArray.Length;
    object lck = new object();
    System.Threading.Tasks.Parallel.ForEach<int, int>(intArray,
    () => 0,
    (x, loop, count) =>
    {
        int value = 0;
        System.Threading.Thread.Sleep(100);
        count++;
        value = (int)(100f / (float)totalcount * (float)count);

        Set(value);
        return count;
    },
    (x) =>
    {

    });
}

private void Set(int i)
{
    if (this.InvokeRequired)
    {
        var result = Invoke(new Action<int>(Set), i);
    }
    else
        progressBar1.Value = i;
}

有时它会毫无问题地通过,但通常会冻结var result = Invoke (new Action <int> (Set), i)。 试着把我的问题踢出去。

谢谢。


你的问题是Invoke(并排队Task到用户界面TaskScheduler) 都要求 UI 线程处理其消息循环。然而,事实并非如此。它仍在等待Parallel.ForEach循环来完成。这就是您看到僵局的原因。

如果你想要Parallel.ForEach要在不阻塞 UI 线程的情况下运行,请将其包装到Task, 像这样:

private TaskScheduler ui;
private void button1_Click(object sender, EventArgs e) 
{
    ui = TaskScheduler.FromCurrentSynchronizationContext();
    DateTime start = DateTime.Now;
    Task.Factory.StartNew(pforeach)
        .ContinueWith(task =>
        {
            task.Wait(); // Ensure errors are propogated to the UI thread.
            Text = (DateTime.Now - start).ToString(); 
        }, ui);
} 

private void pforeach() 
{ 
    int[] intArray = new int[60]; 
    int totalcount = intArray.Length; 
    object lck = new object(); 
    System.Threading.Tasks.Parallel.ForEach<int, int>(intArray, 
    () => 0, 
    (x, loop, count) => 
    { 
        int value = 0; 
        System.Threading.Thread.Sleep(100); 
        count++; 
        value = (int)(100f / (float)totalcount * (float)count); 

        Task.Factory.StartNew(
            () => Set(value),
            CancellationToken.None,
            TaskCreationOptions.None,
            ui).Wait();
        return count; 
    }, 
    (x) => 
    { 

    }); 
} 

private void Set(int i) 
{ 
    progressBar1.Value = i; 
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用并行化 foreach 时出现问题 的相关文章

随机推荐

  • 无法将常量添加到 R 中的向量

    我不知道发生了什么 但我似乎无法向向量添加常量 例如 在控制台中键入 c 1 2 3 4 5 将返回 15 而不是 6 7 8 9 我究竟做错了什么 感谢您的帮助 有人 可能是你 重新定义了 功能 这很容易做到 gt lt function
  • Apache - 使用 .htaccess 将 jpg 重写为 URL

    您好 我尝试从 jpg 文件重定向到特定的 URL 地址 但它不起作用 某人可以帮助我吗 RewriteEngine On RewriteBase RewriteCond REQUEST URI jpg NC RewriteRule up
  • 使用 C 从 C++ 访问公共类内存

    大家好 我目前正在 UNIX 上用 C C 和 fortran 编写多语言程序 不幸的是 当我尝试编译后执行时 遇到 分段错误 我已将问题范围缩小到程序的 C 和 C 部分之间的接口 第一部分由 main ccp 和 SA cpp 组成 第
  • 安装 MS Platform SDK 后在 Visual C++ 2008 中编译时出错

    我正在使用 OpenCV 在安装 Microsoft Platform SDK 来使用 OpenGL 后 尝试编译我的 opencv 项目时会出现这些错误 1 gt d program files microsoft platform sd
  • Socket.IO 基本示例不起作用

    我对 Socket IO 是 100 的新手 刚刚安装了它 我试图遵循一些示例 并且可以让服务器端运行 但我似乎无法连接客户端 以下是我的 server js var http require http io require socket
  • 无法使用基于 JMS 的代码和 amqp 1.0 访问 ActiveMQ

    我正在尝试使用 AMQP 1 0 连接到 ActiveMQ 代理 但我想在我的应用程序代码中使用 JMS 我对使用 JMS 感兴趣主要是因为我希望开发人员能够使用他们已经熟悉的 API 我在本地主机上运行 ActiveMQ 5 14 0 和
  • 如何在Java中进行反向DNS查找

    我有一个 IP 列表 我需要做反向DNS 即我想要网站名称 我尝试了以下方法 InetAddress addr InetAddress getByName 98 138 253 109 String host addr getCanonic
  • 将具有未命名条目的列表列表转换为数据框或小标题

    我正在使用reticulateRStudio 中的 R 包运行一些 python 代码以从 ROOT 获取数据 http root cern ch 到 R 中 我的问题是 python 代码返回一个按行列表的列表 例如 在Python中 0
  • 通过 LINQ 将函数应用于集合的所有元素[重复]

    这个问题在这里已经有答案了 我最近开始使用 LINQ 它非常棒 我想知道 LINQ 是否允许我将函数 任何函数 应用于集合的所有元素 而不使用 foreach 类似于 python lambda 函数 例如 如果我有一个 int 列表 我可
  • python 打字模块:Mixin

    下面有没有课typing其行为类似于 mixin 例如 from typing import Union class A pass class B pass class C pass class D A B C pass current a
  • Rest Web 服务问题中使用 JSON 的 jQuery Ajax POST 调用

    我想将一个 JSON 对象从我的页面发布到 Rest WS 但是当我通过 jQuery ajax 调用发布 json 作为输出时 我得到一个带有 的 HTML 页面 HTTP 状态 405 不允许的方法 JSON 的状态 这是我从 Rest
  • 用逗号分割字符串并打印结果

    我使用以下代码来分割字符串并检索它们 Private Sub Button1 Click sender As Object e As EventArgs Handles Button1 Click Dim s As String a bc
  • 如何在R中高效使用Rprof?

    我想知道是否可以从以下位置获取个人资料R 代码的方式类似于matlab的探查器 也就是说 要知道哪些行号是特别慢的 到目前为止我所取得的成绩并不令人满意 我用了Rprof为我制作一个配置文件 使用summaryRprof我得到类似以下内容
  • 用于从网络摄像头进行手势识别的 C# 或 JAVA 库?

    我有一个手势识别项目 我想知道如何使用C 或Java来编程呢 有专门的图书馆吗 我需要编程还是需要特殊设备而不是网络摄像头 你看过吗OpenCV OpenCV 开源计算机视觉 是一个编程函数库 用于实时计算机视觉 OpenCV 的应用示例
  • 在Python中对类实例进行排序

    python 2 7 使用什么来对普通类实例进行排序 我对默认排序行为感兴趣 假设我有课 class S pass 然后我可以创建几个实例 并对它们进行排序 a S b S c S l a a b b c c sorted l 这将打印对象
  • Android 浏览器无法正确处理 touchmove 事件

    当我尝试检查touchmove事件在这个 jsbin 演示它只在 Chrome 和 Opera for Android 中触发一次 之后立即触发touchcancel事件 而不是继续触发touchmove events 基于两者W3C 规范
  • MySQL:何时真正需要 MySQL 中的刷新权限?

    创建新表和用户时 我通常只调用以下命令 CREATE DATABASE mydb GRANT ALL PRIVILEGES ON mydb TO myuser localhost IDENTIFIED BY mypassword 我从来没有
  • 尝试在 React 中导入组件时出现问题

    我在尝试使用 React 导入组件时遇到问题 app js 1 Uncaught ReferenceError 未定义 require 于 5 12 在我 babel min js 24 在 r babel min js 24 在 e sr
  • 在 Windows 7 上安装 Python 并分发会出现“写入失败...权限被拒绝”

    我使用的是 Windows 7 我完全承认我不了解其权限模型 我正在其他选项卡中阅读相关内容 我的用户是管理员 当我尝试运行 python allocate setup py 时 出现 写入失败 权限被拒绝 错误 然后出现 错误 无法在安装
  • 调用并行化 foreach 时出现问题

    我在使用 System Threading Tasks Parallel ForEach 时遇到问题 每个要更新的进度条的主体 但Invoke方法有时会冻结 我将代码附加到进度条和按钮的表单中 private void button1 Cl