首先,如果这是一个已被问过的问题,请不要生气,只是把原来的链接给我,我找不到。谢谢:))
好的,所以我真的不知道怎么解释这个。当我进入我的代码时,它获取位图的所有像素并按顺序将其放入字典中。当我进入代码时,它完全运行并完成其快速。但是,当我没有输入任何断点时,x
和y
colour = bmpThread.GetPixel(x,y);
超出界限并转到4,我不明白为什么。为什么要这样做?如何阻止它呢?
void PixelAnalyse(int x, int y, int currentPixel)
{
Bitmap bmpThread = bmp;
Color colour;
lock (bmpThread)
{
colour = bmpThread.GetPixel(x, y);
//pTemp = bmpThread.GetPixel(x, y);
}
//this.Invoke(new Action(() => dataGridView1.Rows.Clear()));
//Get the pixel colours
arrayOfColours[currentPixel] = colour;
//this.Invoke(new Action(() => dataGridView1.FirstDisplayedCell = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0]));W
//this.Invoke(new Action(() => progressBar1.Value++));
CancellationTokenSource cts = new CancellationTokenSource();
cts.Cancel();
}
private void analyse1_Click(object sender, EventArgs e)
{
ThreadPool.SetMaxThreads(imageSize + 1, imageSize + 1);
for (int m = 0; m < imageSize; m++)
{
arrayOfColours.Add(m, Color.Black);
}
int y, x;
int currentPixel = 0;
for (x = 0; x < xSize; x++)
{
for (y = 0; y < ySize; y++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(o => PixelAnalyse(x, y, currentPixel)));
currentPixel++;
}
}
PrintToDataGraph();
}
答案 0 :(得分:1)
因为你正在捕捉变量,而不是它们的当前值;基本上,你这样做:
currentPixel
,x
和y
(当前值)的操作进行排队这意味着当每个操作实际发生时,currentPixel
,x
和y
的值不是您计划时的值工作。
您可以通过在最低范围内声明新变量来避免这种情况:
var a = x;
var b = y;
var c = currentPixel;
ThreadPool.QueueUserWorkItem(new WaitCallback(o => PixelAnalyse(a, b, c)));
但是,创建许多工作项不太可能是最佳方法;通常你应该更喜欢为线程池创建较少数量的“矮胖”工作项。