2016-08-31 9 views
10

サーバー上のASP.NETアプリケーションが数日間実行した後にGDI +例外をスローし始めます。サーバーを再起動すると、すべてが正常に動作してから数日後に突然この例外が再び発生します。最初に発生した後は、再起動するまで、PNGイメージを保存しようとするたびに発生します。PNG形式で画像を保存するときのGDI +例外

JPEGで画像を保存しようとすると、正常に動作します。

私は私のプロジェクトからこのコードを実行すると、それは失敗します。もう一度

var path = @"C:\Project\images\logo.png"; 
var image = Image.FromFile(path); 

using (var ms = new MemoryStream()) 
{ 
    image.Save(ms, ImageFormat.Png);  // Fails here on GDI+ exception. 
    //image.Save(ms, ImageFormat.Jpeg); // JPEG works somehow 
} 

を:私は、リモートデスクトップを再起動し、このコードを実行すると、それは数日間働き、いくつかの瞬間に突然失敗を開始何度も。

私が試した:

  1. を同じコードでコンソールアプリケーションを作成し、プロジェクトがあるRDPでそれを実行します。それはうまくいった!

  2. 私はこのトピックを読んだ10個以上の記事で示唆されたコードのさまざまなバリエーションがたくさんあります。

  3. GCI.Collect() - ヘルプなし。

  4. 書き込み権限を持つすべてのフォルダをチェックしました(おそらくIISに何かがありますか?)。

  5. その他。

突然何かによって突然変化し、何ができるのか理解できないと思う。

+0

「Image img = Image.FromStream(new MemoryStream(File.ReadAllBytes(path)))」を使ってみてください。 http://stackoverflow.com/questions/788335/why-does-image-fromfile-keep-a-file-handle-open-sometimes –

+0

イメージフォーマットは本当の理由ではありません。おそらく、オリジナル(png)を上書きしようとします。 [here](http://stackoverflow.com/questions/37736815/overwrite-image-picturebox-in-c-sharp/37741101?s=1|5.7472#37741101) – TaW

+1

を参照してください。 – Evk

答えて

8

サーバーを再起動してから数日かけて正常に動作し、突然この例外が発生し、最初に発生するとPNGイメージを保存しようとするたびに再度発生します。

私にはメモリリークのような音がします。 .NETのバージョンはこれにコンパイルされていますか?これはどんなサーバーOSで動作していますか?

あなたは使用してブロック内のあなたのイメージを囲むことで起動することができます。

var path = @"C:\Project\images\logo.png"; 
using (Image image = Image.FromFile(path)) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     image.Save(ms, ImageFormat.Png); 
    } 
} 

This link私はあなたのケースに関連していると信じています。

3

オブジェクトのいずれかが廃棄されているため、GDI +エラーが発生する、これは使用するオブジェクトをよりよく処分します。

エラーが発生した場合は、アプリケーションに一部のディレクトリに対する書き込み権限がないと言えるでしょう。

GDI +は、必ず usingステートメントを使用して好む65534

に画像の高さを制限します。たとえコードが例外をスローしたとしても、オブジェクトを破棄することは決してありません。

var path = @"C:\Project\images\logo.png"; 
using (Image image = Image.FromFile(path)) 
{ 
     using (var ms = new MemoryStream()) 
     { 
      image.Save(ms, ImageFormat.Png); //fails here on GDI+ exception. 
      //image.Save(ms, ImageFormat.Jpeg); //Jpeg Works somehow 
     } 
} 

FROMFILE方法は、ファイルをロックし、その画像を読み取るためのImage.FromStream()メソッドを使用します。

byte[] bytes = System.IO.File.ReadAllBytes(filename); 
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes); 
using (var ms = new MemoryStream()) 
{ 
     image.Save(ms, ImageFormat.Png); //fails here on GDI+ exception. 
     //image.Save(ms, ImageFormat.Jpeg); //Jpeg Works somehow 
} 
0

基本的に、あなたは使い捨てのオブジェクトを持っている場合...それらを処分! イメージは使い捨てで、ビットマップと同様に、Windowsリソースを使用します。 処理しない場合、アプリケーションをシャットダウンするまで、Windowsリソースは解放されません。したがって、インスタンス化されたイメージはすべて破棄する必要があります。

関連する問題