c# - 将 foreach 循环更改为 Parallel.ForEach 和奇怪的错误

标签 c#

我有几个使用传统语法编写的循环

foreach(x in xs) {....}

其中一些循环在计算方面非常密集,我只是使用像这样的并行语法更改它们:

Parallel.ForEach(x, xs => {...});

我看到性能有了显着提高!!现在我的问题是:我是否使用并行多线程引入了错误?我读到线程安全很复杂并且会产生奇怪的错误;我应该担心什么?

最佳答案

访问共享状态很可能不会产生预期的结果。简单示例:

int sum = 0;
for (int i = 0; i < 1000000; i++)
{
    sum++;
}

将此更改为

Parallel.For(0, 1000000, i => { sum++; });

你会看到 sum 会有一些随机值,因为多个线程正在读/写 sum

如果锁定更新,您将解决问题,但实际上您会将操作再次变成顺序操作。

您需要确保循环中发生的任何事情都是安全的。

Microsoft 模式和实践做到了 a book这解释了这一切以及更多。在简单地更改代码以使用并行循环之前,您应该检查一下。

关于c# - 将 foreach 循环更改为 Parallel.ForEach 和奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11616833/

相关文章:

c# - 使用内联SQL语句而不是DAL设计时是否存在性能问题?

c# - 另一个类中的 WPF 事件处理程序

c# - 在 Encoding.ASCII.GetString() 之后删除不可打印的值

c# - C#/ASP.NET 中的控制数组类型循环

c# - 使用 HttpClient 在 localhost 上调用 rest api 导致 401 Unauthorized,IIS 8.5

c# - Task 返回异步方法的 ConditionalAttribute 的等价物

c# - S3 存储桶中的访问被拒绝

c# - 如何从 C# App_Code 类中获取当前页面的 URL?

c# - LINQ 选择 Lambda 形式的非重复计数

c# - .NET 命令提示符 "where"命令的等价物