介入时获取不同的结果(线程)

时间:2016-06-11 23:09:08

标签: c# multithreading for-loop breakpoints

首先,如果这是一个已被问过的问题,请不要生气,只是把原来的链接给我,我找不到。谢谢:))

好的,所以我真的不知道怎么解释这个。当我进入我的代码时,它获取位图的所有像素并按顺序将其放入字典中。当我进入代码时,它完全运行并完成其快速。但是,当我没有输入任何断点时,xy 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();
    }

1 个答案:

答案 0 :(得分:1)

因为你正在捕捉变量,而不是它们的当前值;基本上,你这样做:

  • 对访问变量 currentPixelxy(当前值)的操作进行排队
  • 更改这些变量的值

这意味着当每个操作实际发生时,currentPixelxy的值不是您计划时的值工作

您可以通过在最低范围内声明新变量来避免这种情况:

var a = x;
var b = y;
var c = currentPixel;
ThreadPool.QueueUserWorkItem(new WaitCallback(o => PixelAnalyse(a, b, c)));

但是,创建许多工作项不太可能是最佳方法;通常你应该更喜欢为线程池创建较少数量的“矮胖”工作项。