質問

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(){} で囲みました。 >。これを行ってから、「メモリ不足」の例外は発生していません。

役に立ちましたか?

解決

「もの」を行うと仮定します。リクエストごとに、問題が発生する可能性があります

  1. プロセッサを集中的に使用する操作:時間のかかる画像の操作。

  2. ファイルを保存する場合、ディスクの問題が発生します。

  3. HTTPハンドラー

  4. System.Drawingオブジェクトの破棄を優先する必要があります(使用(){}ステートメント)

  5. 非同期ページはこちらで確認できます。

他のヒント

Webサービスを介して公開される別個の作業サーバーをセットアップしないのはなぜですか。

GDI +オブジェクトを確実に破棄できるように、これらの操作の周囲に例外処理コードを配置することをお勧めします。私の知る限り、 MemoryStream オブジェクトは管理されているため、GCも終了したときに自分自身を閉じる必要がありますが、ストリームも閉じることをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top