批量图像操作一直悬挂

时间:2016-03-01 10:10:10

标签: c# image networking hang file-manipulation

我使用以下代码缩放和裁剪文件夹中的所有图像。

string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file);
string fileExtension = Path.GetExtension(file);
string filePath = Path.GetDirectoryName(file);
string newFileName = string.Empty;
long fileSize = new FileInfo(file).Length;

if (fileSize > fileSizeLimit)
{
    string tempFile = System.IO.Path.GetTempFileName();
    File.Copy(file, tempFile, true);
    Bitmap sourceImage = (Bitmap)System.Drawing.Image.FromFile(tempFile);

    System.Drawing.Image imgPhoto = ScaleCrop(sourceImage, sourceImage.Width / 4, sourceImage.Height / 4, AnchorPosition.Top);
    Bitmap bitImage = new Bitmap(imgPhoto);
    File.Delete(file);

    newFileName = filePath + "\\" + fileNameWithoutExtension + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + CoilWarehouseProcessed + fileExtension;

    bitImage.Save(newFileName, System.Drawing.Imaging.ImageFormat.Jpeg);

    imgPhoto.Dispose();
    bitImage.Dispose();
}

如果我在本地运行应用程序(在VS2010的调试模式下)并将其指向网络驱动器,则每次都会处理所有图像。

如果我从我们的本地网络服务器运行它,问题是应用程序可能不处理图像,它可能处理5,它可能处理1,它从不处理给定文件夹中的所有图像,只有其中一些...然后它挂在客户端浏览器中。

没有事件可以通过事件日志查看...应用程序不会崩溃或错误...它将处理图像的事实证明它不是权限问题。

为什么会发生这种情况?

编辑:感谢wazdev,但我最终测试了一个不那么干扰(并且也不喜欢依赖第三方软件的依赖关系)解决方案,到目前为止看起来都很好......基本上我改变它,以便当它复制流以产生新图像'System.Drawing.Image imgPhoto = ...'时使用using语句来确保处理'temp'图像。我还删除了原始(未剪切/未缩放图像)文件的删除作为最后一个操作(在测试中它运行良好,只有时间会告诉更多用户上线并测试并发性):

string tempFile = System.IO.Path.GetTempFileName();
File.Copy(file, tempFile, true);
Bitmap sourceImage = (Bitmap)System.Drawing.Image.FromFile(tempFile);

System.Drawing.Image imgPhoto = ScaleCrop(sourceImage, sourceImage.Width / 4, sourceImage.Height / 4, AnchorPosition.Top);

Bitmap bitImage;

using (var bmpTemp = new Bitmap(imgPhoto))
{
    bitImage = new Bitmap(bmpTemp);
}

newFileName = filePath + "\\" + fileNameWithoutExtension + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + CoilWarehouseProcessed + fileExtension;

bitImage.Save(newFileName, System.Drawing.Imaging.ImageFormat.Jpeg);

imgPhoto.Dispose();
bitImage.Dispose();
File.Delete(file);

EDIT2:它现在已经存在了几天,我每天都进行测试,效果很好。这就是我所做的一切;

基本上在ScaleCrop()调用内部有一个GC.Collect和一个Wait For Pending Finalisers()调用。我删除了等待挂起的调用并将GC.Collect()移到File.Delete()之后。

1 个答案:

答案 0 :(得分:2)

过去,当RAM耗尽导致分页到磁盘时,我已经看到过这种行为。我在使用ImageResizing.net库方面取得了很大的成功: http://imageresizing.net/

我更新了我的代码以使用此库,但从未回头。

HTH

(我与imageresizing.net没有任何关系 - 我只是一个非常开心的用户)