【问题标题】:Converting a two layer nested for loop to nested Parallel.for loop in C# [duplicate]在C#中将两层嵌套的for循环转换为嵌套的Parallel.for循环[重复]
【发布时间】:2017-09-29 20:03:00
【问题描述】:

我想将 C# 中的以下代码转换为并行代码。我搜索了互联网,但找不到合适的方法。感谢您的帮助。

Bitmap bmp = new Bitmap(1792, 2048);
for (int i = 0; i < 1792; i++)
{
    for (int j = 0; j < 2048; j++)
    {
        bmp.SetPixel(i,j,Color.FromArgb(100, 128, 128));
    }
}

【问题讨论】:

  • 你应该避免在Bitmap中使用多线程,因为它不是线程安全的。
  • 这里是 Microsoft 文档:msdn.microsoft.com/en-us/library/ff963552.aspx(通过在 google 中输入 c# replace a for loop by parallel for 找到)
  • 你不能。位图是一个编组的 GDI+ 对象......
  • 我认为这只是代表代码 - 否则您可以只使用 Graphics.FromImage(Bmp) 和一次调用 Graphics.FillRectangle()
  • 您应该使用 lockbits 并直接编辑字节。

标签: c# parallel.for


【解决方案1】:

你应该只替换外循环:

Bitmap bmp = new Bitmap(1792, 2048);
Parallel.For(0, 1792, i =>
{
    for (int j = 0; j < 2048; j++)
    {
        bmp.SetPixel(i,j,Color.FromArgb(100, 128, 128));
    }
});

这假设同时调用SetPixel 是安全的,对此我不太确定。

【讨论】:

  • 位图不是线程线程安全的
  • @MatthewWhited 感谢您提供信息。我已经在回答中提到了这种可能性。
  • 使用 Parallel.For 会导致运行速度更慢,因为 .SetPixel(...) 中的内部锁
  • 当然,在这种情况下你不会使用Parallel.For。我的观点是:即使使用Parallel.For 有意义,通常也只会将它用于外循环。
  • 这显然是一个x/y problem。 OP实际问题的正确解决方案在重复标记的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 2021-12-30
  • 2012-11-06
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
相关资源
最近更新 更多