Image 是否保证以这种方法处理?
Is Image guaranteed to be disposed in this method?
给定 resizedImage
类型的代码 System.Drawing.Image
:
using (var resizedImage = Resizer.ResizeImage(bytes, requestedWidth))
{
return PNGCompressor.LosslesslyCompressPNG(resizedImage);
}
方法定义为:
public static byte[] LosslesslyCompressPNG(Image image)
{
var fileName = Guid.NewGuid();
var inputFilePath = TempCompressionFolder + fileName + ".png";
image.Save(inputFilePath, ImageFormat.Png);
var outputFilePath = TempCompressionFolder + fileName + "_comp.png";
var startInfo = new ProcessStartInfo
{
FileName = PathToOptiPNGExe,
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true,
Arguments = "\"" + inputFilePath + "\" -out \"" + outputFilePath + "\" -o2 -strip all"
};
using (var process = Process.Start(startInfo))
{
if (process == null)
{
throw new Exception("Could not start " + PathToOptiPNGExe);
}
process.WaitForExit(Settings.Executables.WaitForExitMS);
if (!process.HasExited)
{
process.Kill();
}
}
var bytes = File.ReadAllBytes(outputFilePath);
File.Delete(outputFilePath);
File.Delete(inputFilePath);
return bytes;
}
resizedImage
会一直被处置吗?我想知道这是否是由于启动新进程而导致内存泄漏的根源。
using
statement 保证 Dispose
即使在异常情况下也会被调用。
您正在启动新进程这一事实不会对此实例执行任何操作,因为您没有将实例与此新进程仅 string
参数一起使用。即使您正在使用此实例(通过流参数或其他),using
语句也会处理并释放该实例。
顺便说一句,据我了解,您仅对 "strip" 元数据使用 optipng 工具。有许多其他方法可以做到这一点,而无需在磁盘上创建文件并启动新进程。例如参见 [=15=]
给定 resizedImage
类型的代码 System.Drawing.Image
:
using (var resizedImage = Resizer.ResizeImage(bytes, requestedWidth))
{
return PNGCompressor.LosslesslyCompressPNG(resizedImage);
}
方法定义为:
public static byte[] LosslesslyCompressPNG(Image image)
{
var fileName = Guid.NewGuid();
var inputFilePath = TempCompressionFolder + fileName + ".png";
image.Save(inputFilePath, ImageFormat.Png);
var outputFilePath = TempCompressionFolder + fileName + "_comp.png";
var startInfo = new ProcessStartInfo
{
FileName = PathToOptiPNGExe,
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true,
Arguments = "\"" + inputFilePath + "\" -out \"" + outputFilePath + "\" -o2 -strip all"
};
using (var process = Process.Start(startInfo))
{
if (process == null)
{
throw new Exception("Could not start " + PathToOptiPNGExe);
}
process.WaitForExit(Settings.Executables.WaitForExitMS);
if (!process.HasExited)
{
process.Kill();
}
}
var bytes = File.ReadAllBytes(outputFilePath);
File.Delete(outputFilePath);
File.Delete(inputFilePath);
return bytes;
}
resizedImage
会一直被处置吗?我想知道这是否是由于启动新进程而导致内存泄漏的根源。
using
statement 保证 Dispose
即使在异常情况下也会被调用。
您正在启动新进程这一事实不会对此实例执行任何操作,因为您没有将实例与此新进程仅 string
参数一起使用。即使您正在使用此实例(通过流参数或其他),using
语句也会处理并释放该实例。
顺便说一句,据我了解,您仅对 "strip" 元数据使用 optipng 工具。有许多其他方法可以做到这一点,而无需在磁盘上创建文件并启动新进程。例如参见 [=15=]