Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象当前正在其他地方使用。c中的并行编程#_C#_Parallel Processing - Fatal编程技术网

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

C# 对象当前正在其他地方使用。c中的并行编程#,c#,parallel-processing,C#,Parallel Processing,我有这段代码来并行处理图像像素。但是显示了这个错误 “对象当前正在其他地方使用” 请帮帮我。 多谢各位 Bitmap bmp2=新位图(openFileDialog1.FileName); int[,]a=新int[bmp2.Width,bmp2.Height]; 颜色cc1、cc2、cc3、cc4、cc5、cc6、cc7、cc8、cc9; pictureBox1.Image=bmp2; for(inti1=2;i1 //对于(int j1=2;j1

我有这段代码来并行处理图像像素。但是显示了这个错误 “对象当前正在其他地方使用” 请帮帮我。 多谢各位


Bitmap bmp2=新位图(openFileDialog1.FileName);
int[,]a=新int[bmp2.Width,bmp2.Height];
颜色cc1、cc2、cc3、cc4、cc5、cc6、cc7、cc8、cc9;
pictureBox1.Image=bmp2;
for(inti1=2;i1
//对于(int j1=2;j1
位图不是线程安全的。实际上是这样,因为当您尝试从多个线程访问它时,您会像您一样遇到异常。要从多个线程对其执行类似的操作,请使用LockBits和UnlockBits方法并处理原始数据


另外,GetPixel非常慢,所以如果你做了任何严肃的事情,无论如何都要避免它。

位图不是线程安全的。实际上是这样,因为当您尝试从多个线程访问它时,您会像您一样遇到异常。要从多个线程对其执行类似的操作,请使用LockBits和UnlockBits方法并处理原始数据


另外,GetPixel非常慢,所以如果你做了任何严肃的事情,无论如何都要避免它。

当你并行运行一个循环时,循环内部的工作应该是相互独立的。这里,由于j1-1、j1、j1+1等原因,多个线程可能会尝试访问相同的像素对象!当您并行运行一个循环时,循环中的功应该相互独立。这里,由于j1-1、j1、j1+1等原因,多个线程可能会尝试访问相同的像素对象!
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]));
    });
}