对象目前正在其他地方使用.c#中的并行编程

时间:2015-09-11 20:54:02

标签: c# parallel-processing

我有这个代码通过parallel.for处理图像像素。但是显示了这个错误 "对象目前正在其他地方使用" 请帮我。 谢谢。

Bitmap bmp2 = new Bitmap(openFileDialog1.FileName);
int[,] a = new int[bmp2.Width, bmp2.Height];
Color cc1, cc2, cc3, cc4, cc5, cc6, cc7, cc8, cc9;

pictureBox1.Image = bmp2;

for (int i1 = 2; i1 < bmp2.Width - 2; i1++)
{
    System.Threading.Tasks.Parallel.For(2, bmp2.Height - 2, j1 =>
    //for (int j1 = 2; j1 < bmp2.Height - 2; j1++)
    {
        cc1 = bmp2.GetPixel(i1 - 1, j1 - 1);
        cc2 = bmp2.GetPixel(i1 - 1, j1);
        cc3 = bmp2.GetPixel(i1 - 1, j1 + 1);
        cc4 = bmp2.GetPixel(i1, j1 + 1);
        cc5 = bmp2.GetPixel(i1 + 1, j1 + 1);
        cc6 = bmp2.GetPixel(i1 + 1, j1);
        cc7 = bmp2.GetPixel(i1 + 1, j1 - 1);
        cc8 = bmp2.GetPixel(i1, j1 - 1);
        cc9 = bmp2.GetPixel(i1, j1);
        int[] zr = new int[9] { cc1.R, cc2.R, cc3.R, cc4.R, cc5.R, cc6.R, cc7.R, cc8.R, cc9.R };
        int[] zg = new int[9] { cc1.G, cc2.G, cc3.G, cc4.G, cc5.G, cc6.G, cc7.G, cc8.G, cc9.G };
        int[] zb = new int[9] { cc1.B, cc2.B, cc3.B, cc4.B, cc5.B, cc6.B, cc7.B, cc8.B, cc9.B };
        sort(zr);
        sort(zg);
        sort(zb);
        //      bmp2.SetPixel(i1, j1, Color.FromArgb(zr[5], zg[5], zb[5]));
    });
}

1 个答案:

答案 0 :(得分:0)

位图不是线程安全的。好吧,它真的,因为当你尝试从多个线程访问它时,你会像你一样得到异常。要像从多个线程那样执行操作,请使用LockBits和UnlockBits方法并使用原始数据。

P.S:除此之外,GetPixel 非常慢,所以如果你做任何严肃的事情,无论如何都要避免。