質問
System.Drawingを使用してASP.NETアプリケーションでサムネイルを作成するのは、一見簡単に見えます。しかし、 MSDNから次のことがわかります:
System.Drawing名前空間内のクラスは、WindowsまたはASP.NETサービス内での使用がサポートされていません。これらのアプリケーションタイプのいずれかからこれらのクラスを使用しようとすると、サービスパフォーマンスの低下や実行時例外など、予期しない問題が発生する可能性があります。
このタイプのGDI +コード内で断続的に「メモリ不足」エラーが発生しています。これが原因だと疑い始めています。
サーバー側の画像操作はどのように行われますか?誰も私のサーバーを爆破しない代替を推奨できますか?
以下の関連コード。 System.Drawing.Graphics.DrawImageで例外が断続的に発生します。このプロジェクトを継承したばかりなので、ログをチェックして、これがヒットする頻度/例外を取得する頻度を確認する必要があります...
public byte[] Resize(int newWidth, int newHeight, Image orignalImage)
{
Bitmap bitmap = new Bitmap(newWidth, newHeight);
Graphics g = Graphics.FromImage(bitmap);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
Rectangle r = new Rectangle(0, 0, newWidth, newHeight);
g.DrawImage(orignalImage, r, r.X, r.Y, orignalImage.Width, orignalImage.Height, GraphicsUnit.Pixel);
MemoryStream stream = new MemoryStream();
bitmap.Save(stream, ImageFormat.Jpeg);
// clean up memory leaks
if (bitmap != null)
{
bitmap.Dispose();
bitmap = null;
}
if (g != null)
{
g.Dispose();
g = null;
}
return stream.ToArray();
}
更新:GDI +を使用しているすべての場所をプロジェクト全体で検索し、 IDisposable
のすべてを using(){}
で囲みました。 >。これを行ってから、「メモリ不足」の例外は発生していません。
他のヒント
Webサービスを介して公開される別個の作業サーバーをセットアップしないのはなぜですか。
GDI +オブジェクトを確実に破棄できるように、これらの操作の周囲に例外処理コードを配置することをお勧めします。私の知る限り、 MemoryStream
オブジェクトは管理されているため、GCも終了したときに自分自身を閉じる必要がありますが、ストリームも閉じることをお勧めします。