C# 在using语句中返回后出现位图参数异常

C# 在using语句中返回后出现位图参数异常,c#,bitmap,resize,using,argumentexception,C#,Bitmap,Resize,Using,Argumentexception,因此,我目前正在开发一个图像大小调整器,它工作/工作得很好,但是当我同时处理太多图像时,它给了我一个OutOfMemoryException,导致程序崩溃 为了解决这个问题,我将这些方法包装在一个using语句中,这样位图就可以被正确地处理 但是我注意到,如果我在using语句中返回位图,我会得到这个ArgumentException是未处理的消息 下面是我的ImageResize方法: public Bitmap ResizeImage(MemoryStream ms, Size size)

因此,我目前正在开发一个图像大小调整器,它工作/工作得很好,但是当我同时处理太多图像时,它给了我一个OutOfMemoryException,导致程序崩溃

为了解决这个问题,我将这些方法包装在一个using语句中,这样位图就可以被正确地处理

但是我注意到,如果我在using语句中返回位图,我会得到这个ArgumentException是未处理的消息

下面是我的ImageResize方法:

 public Bitmap ResizeImage(MemoryStream ms, Size size)
    {
        if (comboBox2.Text == "Pixel")
        {
            using (Bitmap img = new Bitmap(new Bitmap(ms, true), size.Width, size.Height))
            {
                var original = new Bitmap(ms, true);
                Graphics graphic = Graphics.FromImage(img);

                //IRRELEVANT CODE.....

                return img;
            }
        }
        else
        {
            return null;
        }
private void button1_Click(object sender, EventArgs e)
    {
    //IRRELEVANT CODE ...
    img = ResizeImage(memory, new Size(getX(), getY()));
    //IRRELEVANT CODE ...
    img.Save(outputFileName, codec, encoderParams); //<-Exception occurs here
    }
在这里,当我尝试在ImageResize方法之外保存图像时:

 public Bitmap ResizeImage(MemoryStream ms, Size size)
    {
        if (comboBox2.Text == "Pixel")
        {
            using (Bitmap img = new Bitmap(new Bitmap(ms, true), size.Width, size.Height))
            {
                var original = new Bitmap(ms, true);
                Graphics graphic = Graphics.FromImage(img);

                //IRRELEVANT CODE.....

                return img;
            }
        }
        else
        {
            return null;
        }
private void button1_Click(object sender, EventArgs e)
    {
    //IRRELEVANT CODE ...
    img = ResizeImage(memory, new Size(getX(), getY()));
    //IRRELEVANT CODE ...
    img.Save(outputFileName, codec, encoderParams); //<-Exception occurs here
    }
当我删除using语句时,一切都很好,但是我必须使用using块来处理位图,从而防止内存泄漏。 另外,当我将图像保存在using语句中时,它也可以正常工作,但在我的例子中,这不是一个解决方案

我做错了什么?在我看来,位图似乎没有正确返回

我感谢您的帮助和提前感谢
你把你的电脑放错地方了。在包括从其返回的使用块结束之后,由该块控制的对象被处理。访问已处理的位图是一个错误

您的使用需要放在这里:

private void button1_Click(object sender, EventArgs e)
{
    //IRRELEVANT CODE ...
    using(img = ResizeImage(memory, new Size(getX(), getY())))
    {
        //IRRELEVANT CODE ...
       img.Save(outputFileName, codec, encoderParams);
    }
}

你用错地方了。在包括从其返回的使用块结束之后,由该块控制的对象被处理。访问已处理的位图是一个错误

您的使用需要放在这里:

private void button1_Click(object sender, EventArgs e)
{
    //IRRELEVANT CODE ...
    using(img = ResizeImage(memory, new Size(getX(), getY())))
    {
        //IRRELEVANT CODE ...
       img.Save(outputFileName, codec, encoderParams);
    }
}

好的,我终于解决了内存泄漏的问题,结果证明我确实是在释放/处理图像,但它做得不够快,这导致了这个outOufMemoryException,当你一个接一个地处理很多非常大的图像时。我试着让一切都多线程化,总是等待工作集变小,但没有成功

事实证明,这比我想象的要容易,我所要做的就是在我调整大小的方法的末尾:

GC.Collect();
GC.WaitForPendingFinalizers();
System.Threading.Thread.SpinWait(5000);

这似乎是调整10-20mb大小和10000x1000分辨率的大图像大小的魔法。有人能解释为什么SpinWait有帮助,但不是正常的线程睡眠吗?每当我尝试休眠线程时,它似乎也会休眠内存的释放。

好的,我终于解决了内存泄漏的问题,事实证明,我确实是在释放/处理图像,但它做得不够快,这导致了这个outOufMemoryException,当你处理很多非常大的图像时,紧接着。我试着让一切都多线程化,总是等待工作集变小,但没有成功

事实证明,这比我想象的要容易,我所要做的就是在我调整大小的方法的末尾:

GC.Collect();
GC.WaitForPendingFinalizers();
System.Threading.Thread.SpinWait(5000);

这似乎是调整10-20mb大小和10000x1000分辨率的大图像大小的魔法。有人能解释为什么SpinWait有帮助,但不是正常的线程睡眠吗?每当我尝试休眠线程时,它似乎也会休眠内存的释放。

我喜欢注释//不相关的代码。。。。如果你喜欢的话,可以发布它:D,但老实说,在这种情况下,它是不相关的。我喜欢注释//不相关的代码。。。。它属于你。哈哈哈,如果你喜欢的话就发吧:D,但老实说,在这种情况下它是不相关的。提供更多关于不太相关的代码的细节,或者简单地限制你一次处理多少图像。哦,我是sry,我读错了,我没有得到MemoryException,但是我得到了ArgumentException,它是我在ResizeImage方法的button click事件中收到的。。。太好了,我又回到了我开始的地方。您是否删除了在ResizeImage中使用的?2.为了什么理由。是的,我把它恢复到2点以前的状态。当我初始化bmp时会发生这种情况,但是我注意到,如果我只使用一个图像,它就可以工作,但是如果我处理许多图片,它会从VS调试器中给我这个ArgumentException,但是如果我运行可执行文件,它会告诉我OutOfMemory而不是ArgumentException,可能有什么东西混在一起了?我注意到一件事:您使用的图形对象需要在using块中,因为它也实现了IDisposable。该块将放在ResizeImage中。请提供与此无关的代码的更多详细信息,或者简单地限制您一次处理的图像数量。哦,我很抱歉,我读错了,我没有收到MemoryException,但我收到了ResizeImage方法中的button click事件中收到的ArgumentException。。。太好了,我又回到了我开始的地方。您是否删除了在ResizeImage中使用的?2.为了什么理由。是的,我把它恢复到2点以前的状态。它发生在我初始化bmp时,但是我注意到,如果我只使用一个图像,它就可以工作,但是如果我处理许多图片,它会从VS调试器中给我这个ArgumentException,但是如果我运行可执行文件,它会告诉我OutOfMemory而不是ArgumentException,可能是som
有一件事我注意到了:您使用的图形对象需要位于using块中,因为它也实现了IDisposable。该块将放入ResizeImage中。