6

我有一个“图像”列表,其中包含大约 20 张照片,每张大约 1MB。我想通过单击下一步按钮滚动列表中的图像。但是在大约 8 张照片之后,我失去了记忆。

    private void button4_Click(object sender, EventArgs e) //next
    {
        index++;
        if (index >= images.Count) index = 0;
        CurrImage = images[index]; 
        Bitmap b = new Bitmap((Bitmap)CurrImage.Clone()); //breakpoint occurs her
        pictureBox1.Image = b; 

        NewThread = new Thread(new ThreadStart(ChooseColors2));
    }

ChooseColors2 线程将使用“CurrImage”,所以为了避免竞争条件,我通过创建一个新的位图来避免这种情况,如上所示

请注意,如果我使用 pictureBox1.Image = CurrImage; 如果不创建新的位图,我不会收到此错误,但线程会出现竞争条件异常。

4

2 回答 2

4

您可以在将新的位图分配给 之前尝试调用以下命令pictureBox1.Image,以删除以前的“新”位图并释放资源:

pictureBox1.Image.Dispose();
于 2013-03-19T03:41:53.297 回答
0

我相信你也可以尝试使用using关键字;因为它将确保对象在其作用域之后直接被释放。你可以这样做:

using (Bitmap b = new Bitmap((Bitmap)CurrImage.Clone()))
{
    pictureBox1.Image = b;
}`

有关详细信息,请查看C# 中“使用”的用途是什么

于 2019-01-16T10:18:51.613 回答