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

本文关键字:并行 编程 方使用 其他 对象 | 更新日期: 2023-09-27 18:12:28

我有这个代码来并行处理图像像素。对。但是显示了这个错误"对象目前正在其他地方使用"请帮帮我。谢谢你。


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]));
    });
}

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

位图不是线程安全的。实际上,就是,因为当你试图从几个线程访问它时,你会得到异常。要像在多线程中那样对它进行操作,请使用LockBits和UnlockBits方法并处理原始数据。

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