使用Dispose()方法时应用程序会中断,即使相同的代码在不同的事件中有效

时间:2012-10-30 21:03:24

标签: c# dispose

几天前,我开始使用自己的照片浏览器/编辑器。我已经实现了方法“OnKeyDown”,它根据按下的箭头键改变照片:

case Keys.Left:
            case Keys.Down:
                ic.getImage().Dispose();
                --fileIndex;
                if (fileIndex < 0)
                    fileIndex = (fileCount - 1);
                ic.setImage(Image.FromFile(fileNames[fileIndex]), ref pictureBox1);
            break;

            case Keys.Right:
            case Keys.Up:
                ic.getImage().Dispose();
                ++fileIndex;
                fileIndex %= fileCount;
                ic.setImage(Image.FromFile(fileNames[fileIndex]), ref pictureBox1);
            break;

这完美无缺。我想做的下一件事是编写幻灯片,所以我使用System.Timers.Timer来触发事件goRight(),它执行相同的代码,如同按下右箭头键一样:

public void goRight(object source, ElapsedEventArgs e)
    {
            ic.getImage().Dispose();
            ++fileIndex;
            fileIndex %= fileCount;
            ic.setImage(Image.FromFile(fileNames[fileIndex]), ref pictureBox1);
    }

使用幻灯片应用时,只需中断。我无法弄清楚为什么,因为代码是完全一样的。如果我注释掉ic.getImage()。Dispose()幻灯片可以正常工作,但随着每张下一张照片,RAM中的数据量会越来越高。

我做错了吗?谢谢你的时间,我很感激!

呃,我差点忘了。是否有一种方法可以使索引在没有if语句的情况下向后移动(在向下键和向左键事件中)(如向前运算符%)。我试过这个:

++fileIndex;
fileIndex %= fileCount;
ic.setImage(Image.FromFile(fileNames[(fileCount -1) - fileIndex]), ref pictureBox1);

如果我只向一个方向前进,它会很有效,但如果我改变方向,它会跳过几个索引。有什么想法吗?

祝你好运。 ž

1 个答案:

答案 0 :(得分:1)

对于索引,您可以执行以下操作:

fileIndex = (fileIndex == 0) ? fileCount -1 : fileIndex - 1; // decrementing

fileIndex = (fileIndex == fileCount - 1) ? 0 : fileIndex + 1; // incrementing

正如cHao所说,请改用System.Windows.Forms.Timer。