2011-07-05 16 views
0

私はいくつかの画像をダウンロードし、後で処理するarrarListに入れるプロジェクトに取り組んでいます。コードの次の部分は、問題の場所です。それは最初のダウンロードで動作しますが、何らかの理由でファイルの保存先は最初のダウンロード後にロックされます。私はそれを解除する方法を見つけることができないようです。 File.Delete( "BufferImg"); "BufferImg"がプログラムの他の場所で使用されていなかった場合、ファイルが別のプロセスで使用されているというエラーが表示されます。私は間違って何をしていますか?画像ファイルが破棄された後に解放されない

int attempcnt=0; 
if (ok) 
{ 
    System.Net.WebClient myWebClient = new System.Net.WebClient(); 
    try 
    { 
     myWebClient.DownloadFile(pth, "BufferImg"); 
     lock (IMRequest) { IMRequest.RemoveAt(0); } 
     attempcnt = 0; 
    } 
    catch // will attempcnt 3 time before it remove the request from the queue 
    { 
     attempcnt++; 
     myWebClient.Dispose(); 
     myWebClient = null; 
     if(attempcnt >2) 
     { 
      lock (IMRequest) { IMRequest.RemoveAt(0); } 
      attempcnt = 0; 
     } 
     goto endofWhile; 
    } 
    myWebClient.Dispose(); 
    myWebClient = null; 
    using (Image img = Image.FromFile("BufferImg")) 
    { 
     lock (IMBuffer) 
     { 
      IMBuffer.Add(img.Clone()); 
      MessageBox.Show("worker filled: " + IMBuffer.Count.ToString() + ": " + pth); 
     } 
     img.Dispose(); 
    } 
} 
endofWhile: 
File.Delete("BufferImg"); 
continue; 

}

答えて

0

次の行は画像がリリースされていない理由は次のとおりです。

IMBuffer.Add(img.Clone()); 

あなたは、リソース(ファイル)を介してロードされた何かを複製し、ファイルがまだに取り付けられています。クローンオブジェクト。

FileStream fs = new FileStream("BufferImg", FileMode.Open, FileAccess.Read); 
using (Image img = Image.FromStream(fs)) 
{ 
    lock (IMBuffer) 
    { 
     IMBuffer.Add(img); 
     MessageBox.Show("worker filled: " + IMBuffer.Count.ToString() + ": " + pth); 
    } 
} 
fs.Close(); 

ファイルをバッファにロードした後、ファイルを解放する必要があります。

+0

イメージが解放されなかった問題を解決しましたが、別の問題も発生しました。画像はストリームを使用して作成されているため、ここで指摘したようにストリームを閉じた後に保存しても問題はありませんhttp://stackoverflow.com/questions/1053052/a-generic-error-occurred-in-gdi-jpeg -image-to-memorystream – codeAsIGo

+0

@codeAsigoストリームを使用して画像をロードすることとは関係ありません。画像をバイト配列に変換するのを助けたい場合は、ストリームを使用して読み込んだときに新しい質問を開き、それに答えさせます。 –

関連する問題