.net 系统图/GDI+;动态为web生成图形时出错

.net 系统图/GDI+;动态为web生成图形时出错,.net,vb.net,gdi+,gdi,system.drawing,.net,Vb.net,Gdi+,Gdi,System.drawing,我正在为一家公司建立一个基于.NET的电子商务网站,该公司制作由客户在网站上实时创建的新奇标志。这个想法与一些你必须自己完成所有设计工作的网站有点不同——在这个网站上,基本上有一些标志组合成主题,带有预先确定的“文本区域”,客户在其中输入他们独特的文本。然后,我使用System.Drawing/GDI+在服务器端动态构建一个图形。我发现在生成了大约9000个图形后(这个数字可能无关紧要,可能与另一个操作操作有关),我得到了一个模糊的GDI+错误,整个网站都重置了。我想知道我是否应该使用更好的图形

我正在为一家公司建立一个基于.NET的电子商务网站,该公司制作由客户在网站上实时创建的新奇标志。这个想法与一些你必须自己完成所有设计工作的网站有点不同——在这个网站上,基本上有一些标志组合成主题,带有预先确定的“文本区域”,客户在其中输入他们独特的文本。然后,我使用System.Drawing/GDI+在服务器端动态构建一个图形。我发现在生成了大约9000个图形后(这个数字可能无关紧要,可能与另一个操作操作有关),我得到了一个模糊的GDI+错误,整个网站都重置了。我想知道我是否应该使用更好的图形例程,因为我已经完成了我的代码,发布并清理了对象,缓存了图像,这样同一个图像就不会被反复处理,仍然会出现错误。无论我是一个接一个地(比如说几天)制作图像,还是作为一个大批量(有时会用于批量上传到其他在线商店)制作图像,都会发生这种情况

我在事件日志中看到的错误

故障应用程序w3wp.exe,版本7.0.6002.18005,时间戳0x49e023cf,故障模块gdiplus.dll,版本5.2.6002.18813,时间戳0x515ba857,异常代码0xc0000005,故障偏移量0x00104be6,进程id 0x1018,应用程序启动时间0x01ce82423201ac62

当然感觉像是记忆问题,但我找不到

我的代码包含许多组件,例如:

  • 从磁盘加载基本映像并将其大小调整为“工作”大小以进行操作
  • 添加1-X条自定义文本(X由产品决定)
  • 平滑文本并按比例缩放
  • 每个自定义文本都可以有不同的字体、颜色等
  • 这些文本中的每一条都可以有一个阴影(相同的文本,快速移动)
  • 在添加文本后,用半透明图形覆盖整个图像,使其成为“天气”或“木纹”
所有这些都可以通过使用一些基本循环和GDI+绘图技术轻松完成。我也考虑过在客户端使用JavaScript来实现这一点,但由于每个产品都可以设置独特的选项,并且使用服务器端的特殊授权字体,这将变得非常复杂

我没有看到任何大的内存泄漏,甚至在站点重置时释放内存

所以我真正想要的是关于是否应该使用不同的服务器端绘图例程的意见。我真的无法复制一个好的代码样本,因为单是绘图例程就有500多行代码,但它使用了很多DrawString、SmoothingMode、InterpolationMode、PixelOffsetMode、SetResolution等方法和属性


欢迎您查看正在运行的站点-

9000是一个神奇的数字,接近Windows规定的10000个句柄配额。查找程序中的GDI句柄泄漏。在taskmgr.exe、查看+添加列、GDI对象中可见。Dispose()你的系统。认真地画对象。同意。这几乎肯定是一个问题,您只是不处理您的GDI对象。Windows仅允许每个进程同时使用10000个GDI对象。确保您正在处理实现
IDisposable
接口的每个对象(例如位图、笔)。您可以通过调用
Dispose
来实现,或者最好使用
语句声明变量;我不知道有10000个手柄的配额。我将回顾所有代码,并检查taskmgr。我已经检查了代码,删除了所有额外的引用,然后向我使用的每个system.drawing对象以及具有Dispose方法的任何其他对象添加了.Dispose。它似乎工作得更好,我制作了10000多张图片,但后来又重新设置了。下面是任务管理器的屏幕截图:GDI对象位于右侧第二个,在整个过程中始终保持为0。内存使用后的数字是“句柄”,在500到700之间波动,但稳定在600左右。