Pergunta

Meu aplicativo ASP.NET possui uma imagem de corte e redimensionamento. Isso exige que a imagem temporária enviada seja excluída. Tudo funciona bem, mas quando tento excluir uma imagem maior que 80px por 80px, recebo um erro "é bloqueado por outro processo ...", mesmo que eu tenha lançado todos os recursos.

Aqui está um trecho:

System.Drawing.Image tempimg = System.Drawing.Image.FromFile(temppath);
System.Drawing.Image img = (System.Drawing.Image) tempimg.Clone(); //advice from another forum
tempimg.Dispose();

img = resizeImage(img, 200, 200); //delete only works if it's 80, 80
img.Save(newpath);
img.Dispose();

File.Delete(temppath);
Foi útil?

Solução

Eu acho que você não está descartando a primeira instância de imagem atribuída à variável IMG.

Considere isso em vez disso:

System.Drawing.Image tempimg = System.Drawing.Image.FromFile(temppath);
System.Drawing.Image img = (System.Drawing.Image) tempimg.Clone();
tempimg.Dispose();

System.Drawing.Image img2 = resizeImage(img, 200, 200);
img2.Save(newpath);
img2.Dispose();
img.Dispose();

File.Delete(temppath);

Outras dicas

Se você criar a imagem dessa maneira, ela não será bloqueada:

using (FileStream fs = new FileStream(info.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    byte[] data = new byte[fs.Length];
                    int read = fs.Read(data, 0, (int)fs.Length);
                    MemoryStream ms = new MemoryStream(data, false);
                    return Image.FromStream(ms, false, false); // prevent GDI from holding image file open
                }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top