GDI+.De dessin.Bitmap donne une erreur de Paramètre n'est pas valide par intermittence
J'ai un code C# dans un ASP.Net application qui fait cela:
Bitmap bmp = new Bitmap(1184, 1900);
Et, occasionnellement, il déclenche une exception "Paramètre n'est pas valide". Maintenant, j'ai été googler autour et apparemment GDI+ est tristement célèbre pour lancer aléatoire des exceptions, et beaucoup de gens ont eu ce problème, mais personne n'a une solution à ça! J'ai vérifié le système et il a beaucoup de mémoire vive (RAM) et de l'espace de swap.
Maintenant, dans le passé, si je fais un "iisreset' le problème disparaît, mais il revient dans quelques jours. Mais je ne suis pas convaincu que j'ai causé une fuite de mémoire, parce que comme je l'ai dit ci-dessus, il ya beaucoup de ram+swap gratuit.
Quelqu'un a une solutions?
OriginalL'auteur | 2008-09-25
Vous devez vous connecter pour publier un commentaire.
Arrêt de l'utilisation de GDI+ et de commencer à utiliser WPF Imagerie classes (.NET 3.0). Ces sont l'un des principaux nettoyage de la GDI+ classes et optimisé pour les performances. En outre, elle met en place une "image de la chaîne" qui vous permet d'effectuer plusieurs actions sur l'image bitmap dans une manière efficace.
Trouver plus par la lecture sur les BitmapSource
Voici un exemple de partir d'un vide bitmap n'attend que de recevoir des pixels:
Qu'en est rendu dans asp.net? Pas De Système.Windows il...
OriginalL'auteur Frank Krueger
Pour toute personne intéressée, la solution que je vais utiliser est le Mono.Le caire des bibliothèques de la mono C# de distribution au lieu d'utiliser le système.de dessin. Si je dois simplement faire glisser le mono.cairo.dll, libcairo-2.dll, libpng13.dll et zlib1.dll les fichiers de la version windows de mono dans le même dossier que mon fichier exécutable, puis je peux développer dans windows à l'aide de visual studio 2005 et tout fonctionne très bien.
Mise à jour - je l'ai fait ci-dessus, et le stress testé l'application et tout semble fonctionner correctement maintenant, et utilise jusqu'à moins de 200 mo de ram au démarrage. Très heureuse.
OriginalL'auteur
Tout ce que j'ai vu à ce jour dans mon contexte est lié à des fuites de mémoire /gérer les fuites. Je vous recommande de prendre une nouvelle paire d'yeux pour étudier votre code.
Ce qui se passe réellement est que l'image est disposé, à un point aléatoire dans l'avenir, même si vous avez créé sur la ligne de code précédente. Cela peut être en raison d'un mémoire/d'une fuite de handles (nettoyage de certains de mon code semble s'améliorer, mais pas de résoudre complètement ce problème).
Parce que cette erreur se produit après que l'application ait été en usage pendant un certain temps, parfois en utilisant beaucoup de mémoire, parfois, je ressens le garbage collector ne respecte pas les règles parce que certains ajustements liés à des services et c'est pourquoi Microsoft se lave les mains de ce problème.
http://blog.lavablast.com/post/2007/11/The-Mysterious-Parameter-Is-Not-Valid-Exception.aspx
OriginalL'auteur Jason Kealey
Vous n'avez pas seulement besoin de suffisamment de mémoire, il doit être contiguë. Au fil du temps de la mémoire est fragmentée et il devient plus difficile de trouver de gros blocs. Il n'y a pas beaucoup de bonnes solutions à ce, en dehors de la construction des images de petites images.
new Bitmap(x, y) à peu près juste besoin d'allouer de la mémoire, en supposant que votre programme n'est pas endommagé (est-il dangereux de code qui pourrait endommager le tas), alors je voudrais commencer par cette allocation défaut. Besoin d'un bloc contigu est de savoir comment un semblant de petite allocation pourrait échouer. La Fragmentation du tas est quelque chose qui est habituellement résolu avec un allocateur personnalisé -- je ne pense pas que ce soit une bonne idée dans IIS (ou possible).
De voir quelle est l'erreur que vous obtenez sur de la mémoire, essayez juste de l'allocation d'un gigantesque Bitmap comme un test -- voir quelle erreur il jette.
Une stratégie que j'ai vu, c'est de pré-allouer de gros blocs de mémoire (dans votre cas, les images bitmap) et de les traiter comme une piscine (l'obtenir et de le retourner à la piscine). Si vous avez seulement besoin d'eux pour une courte période de temps, vous pourriez être en mesure de s'en tirer avec juste de garder un peu de mémoire et de partage.
OriginalL'auteur Lou Franco
Je viens de recevoir une réponse du support technique microsoft. Apparemment, si vous regardez ici:
http://msdn.microsoft.com/en-us/library/system.drawing.aspx
Vous pouvez le voir, il dit: "les Classes à l'intérieur du Système.Le dessin de l'espace de noms ne sont pas pris en charge pour une utilisation à l'intérieur d'un Windows ou d'ASP.NET service. Essayez d'utiliser ces classes à partir de l'intérieur de l'un de ces types d'application peuvent produire des problèmes inattendus, comme une diminution des services de la performance et de l'exécution des exceptions."
Ils sont donc, fondamentalement, se laver les mains de la question.
Il apparaît qu'ils sont en admettant que cette section de la .Net framework n'est pas fiable. Je suis un peu déçu.
Jusqu'à la prochaine - peut-on recommander une bibliothèque semblable pour ouvrir un fichier gif, superposer du texte, et l'enregistrer de nouveau?
OriginalL'auteur
Classes à l'intérieur du Système.Le dessin de l'espace de noms ne sont pas pris en charge pour une utilisation à l'intérieur d'un Windows ou d'ASP.NET service
Pour une prise en charge alternative, voir Windows Composants D'Imagerie (msdn), une bibliothèque native qui, ironiquement Système.Le dessin est basé sur.
OriginalL'auteur Tony Edgecombe