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