我在ASP.Net应用程序中有一些C#代码可以执行此操作:
位图bmp =新位图(1184,1900);
偶尔它会引发异常“参数无效”。现在我一直在谷歌搜索,显然GDI +因为抛出随机异常而臭名昭着,很多人都遇到过这个问题,但没有人能解决它!我检查了系统,它有足够的RAM和交换空间。 现在过去,如果我做了'iisreset'那么问题就会消失,但它会在几天内回来。但我不相信我已经造成了内存泄漏,因为正如我上面说的那样,有大量的ram + swap free。
有人有任何解决方案吗?
答案 0 :(得分:10)
停止使用GDI +并开始使用WPF Imaging类(.NET 3.0)。这些是GDI +类的主要清理,并针对性能进行了调整。此外,它还设置了一个“位图链”,允许您以有效的方式轻松地对位图执行多个操作。
阅读有关BitmapSource
的详情这是一个以等待接收某些像素的空白位图开始的示例:
using System.Windows.Media.Imaging;
class Program {
public static void Main(string[] args) {
var bmp = new WriteableBitmap(1184, 1900, 96.0, 96.0, PixelFormat.Bgr32, null);
}
}
答案 1 :(得分:6)
对于任何感兴趣的人,我将要使用的解决方案是单声道C#发行版中的Mono.Cairo库,而不是使用system.drawing。如果我只是将mono.cairo.dll,libcairo-2.dll,libpng13.dll和zlib1.dll文件从单声道的windows版本拖到与我的可执行文件相同的文件夹中,那么我可以使用visual studio 2005在Windows中开发一切都很好。
更新 - 我已经完成了上述工作,并对应用程序进行了压力测试,现在它们似乎运行顺畅,并且使用最多200mb的内存来启动。非常高兴。
答案 2 :(得分:3)
我在上下文中看到的所有内容都与内存泄漏/处理泄漏有关。我建议你戴上一双新的眼睛来调查你的代码。
实际发生的是,即使您在前一行代码中创建了图像,图像也会在将来随机放置。这可能是因为内存/句柄泄漏(清除我的代码中的一些似乎有所改善但不能完全解决此问题)。
因为这个错误发生在应用程序使用一段时间之后,有时使用大量内存,有时候没有,我觉得垃圾收集器不遵守规则,因为一些与服务相关的特殊调整,这就是为什么微软洗手了这个问题。
http://blog.lavablast.com/post/2007/11/The-Mysterious-Parameter-Is-Not-Valid-Exception.aspx
答案 3 :(得分:1)
你不仅需要足够的内存,还需要连续。随着时间的推移,内存变得支离破碎,找到大块会变得更加困难。除了从较小的位图构建图像之外,没有很多好的解决方案。
新的Bitmap(x,y)几乎只需要分配内存 - 假设您的程序没有以某种方式损坏(是否存在可能破坏堆的不安全代码),那么我将从这个分配开始失败。需要一个连续的块是一个看似很小的分配可能会失败的方式。堆的碎片通常是通过自定义分配器解决的 - 我不认为这在IIS(或可能)中是个好主意。
要查看内存不足的错误,请尝试将一个巨大的Bitmap作为测试分配 - 看看它会抛出什么错误。
我见过的一个策略是预先分配一些大块内存(在你的情况下是Bitmaps)并将它们视为一个池(获取并将它们返回池中)。如果你只是在短时间内需要它们,你可能只需保留一些内存并分享它们即可。
答案 4 :(得分:0)
我刚收到微软支持的回复。显然,如果你看这里:
http://msdn.microsoft.com/en-us/library/system.drawing.aspx
您可以看到它说“不支持在Windows或ASP.NET服务中使用System.Drawing命名空间中的类。尝试在其中一种应用程序类型中使用这些类可能会产生意外问题,例如减少服务性能和运行时异常。“ 所以他们基本上都在洗手问题。 他们似乎承认.Net框架的这一部分是不可靠的。我有点失望。
接下来 - 任何人都可以推荐一个类似的库来打开一个gif文件,叠加一些文字,然后再次保存吗?
答案 5 :(得分:0)
不支持在Windows或ASP.NET服务中使用System.Drawing命名空间中的类
有关支持的替代方案,请参阅Windows Imaging Components(msdn),这是一个具有讽刺意味的System.Drawing基于的本机库。